2010-04-05 11 views
6

Tengo un archivo de texto llamado num.txt cuyo único contenido es la línea 123. Entonces tengo el siguiente:C++ Novato: Pasar un fstream a una función para leer datos

void alt_reader(ifstream &file, char* line){ 
    file.read(line, 3); 
    cout << "First Time: " << line << endl; 
} 

int main() { 
    ifstream inFile; 
    int num; 
    inFile.open("num.txt"); 
    alt_reader(inFile, (char*)&num); 
    cout << "Second Time: " << num << endl; 
} 

La salida es:

First Time: 123 
Second Time: 3355185 

¿Puede ayudarme a averiguar cómo obtener una fstream que se lee en una función aún asignar la variable principal? Estoy haciendo esto porque alt_reader realmente tiene mucho más que eso, pero esta es la parte en la que estoy estancado. Muchas gracias por la ayuda.

ACTUALIZACIÓN: uso de comentarios de Bill Oneal, he escrito

void alt_reader(ifstream &file, stringstream &str, int n){ 
    char buffer[n+1]; 
    file.read(buffer, n); 
    buffer[n] = 0; 
    str << buffer; 
    cout << "First Time: " << buffer << endl; //First Time: 123 
} 

int main() { 
    ifstream inFile; 
    stringstream strm; 
    int num; 
    inFile.open("num.txt"); 
    alt_reader(inFile, strm, 3); 
    cout << "Second Time: " << num << endl; //Second Time: 123 
} 

Gracias. ¿Alguna crítica con lo que hay ahora?

Respuesta

7

La primera vez que imprimió la variable, la imprimió como char *, imprimiendo tratando el archivo como un archivo de texto (y tiene suerte de que no se bloquee). La segunda vez que lo imprimió, lo reinterpretó como int, lo que hace que la representación sea completamente diferente.

Cada vez que convierta punteros de un tipo a otro tipo, normalmente invoca un comportamiento indefinido. Como char no tiene una relación estándar con int, la tiene aquí.

EDIT: Para responder a su comentario pregunta:

#include <sstream> 

void foo(std::stream &str) { 
str << "42\n"; 
}; 

int main() { 
int aNumber; 
std::stringstream aStringStream; 
foo(aStringStream); //Pass our stream to the function. It contains 
    //"42\n" when the function returns. 
aStringStream >> aNumber; //aNumber == 42 
aNumber += 10; //aNumber == 52; 
std::cout << aNumber; //Print "52" 
} 
+0

Gracias. ¿Algún consejo sobre pasar un flujo de datos y obtener el valor de lectura de la función (sin una declaración de devolución?)? – physicsmichael

+0

@ vgm64: Claro. Ver editar. –

+0

@Bill ONeal: Acabo de agregar un intento de ampliar mi código con su técnica. Funciona. ¿Que piensas de eso? – physicsmichael

2

Usted tiene al menos dos problemas aquí.

En main():

  1. Usted debe estar pasando un búfer de cadena en alt_reader, en vez estás pasando un int.
  2. Parece que desea leer la cadena '123', pero quiere que int tenga el valor 123.

Se podría hacer:

void alt_reader(ifstream &file, char* line){ 
    file.read(line, 3); 
    line[3]=0; 
    cout << "First Time: " << line << endl; 
} 

int main() { 
    ifstream inFile; 
    inFile.open("num.txt"); 

    char buffer[128]; 
    alt_reader(inFile, buffer); 

    int num=atoi(buffer); 
    cout << "Second Time: " << num << endl; 

    return 0; 
} 

Tenga en cuenta que he añadido a line[3]=0;alt_reader y atoi realiza la conversión de la cadena (un SCII) a int.

+0

@quamrana: Eso funcionaría perfectamente para la situación que describí, pero el número que leeré no es necesariamente un int, y el la secuencia de secuencia de abajo estará feliz en un int o doble. Aun así, muchas gracias. – physicsmichael

Cuestiones relacionadas