2010-04-05 3 views
6

Ho un file di testo denominato num.txt l'unico contenuto è la riga 123. Poi ho il seguente:C++ Newbie: passaggio di un flusso a una funzione per leggere i dati

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; 
} 

L'output è:

First Time: 123 
Second Time: 3355185 

Potete aiutarmi a capire come ottenere un fstream che si legge in una funzione ancora assegnare la variabile in main? Lo sto facendo perché lo alt_reader ha davvero molto di più, ma questa è la parte su cui sono bloccato. Grazie mille per l'aiuto.

UPDATE: Usando i commenti di Bill Oneal, ho scritto

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 
} 

Grazie. Qualche critica con quello che c'è adesso?

risposta

7

La prima volta che hai stampato la variabile, la hai stampata come char *, stampando il file come un file di testo (e sei fortunato che non si sia bloccato). La seconda volta che lo hai stampato, lo hai reinterpretato come int, rendendo la rappresentazione completamente diversa.

Ogni volta che si esegue il cast di puntatori da un tipo all'altro, di solito si invoca un comportamento non definito. Dal char non esiste una relazione standard con int, ce l'hai qui.

EDIT: Per rispondere alla tua domanda commento:

#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

Grazie. Qualche consiglio su come passare un flusso e ottenere il valore letto dalla funzione (senza una dichiarazione di ritorno?)? – physicsmichael

+0

@ vgm64: sicuro. Vedi modifica. –

+0

@Bill ONeal: ho appena aggiunto un tentativo di espandere il mio codice con la tua tecnica. Funziona. Che ne pensate? – physicsmichael

2

Avete almeno due problemi qui.

In main():

  1. Si dovrebbe essere passa un buffer di stringa in alt_reader, invece si sta passando un int.
  2. Sembra che vogliate leggere la stringa '123' ma desidera che un valore int sia 123.

Si potrebbe fare:

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; 
} 

Nota che ho aggiunto al line[3]=0;alt_reader e atoi esegue la conversione da stringa (a SCII) a int.

+0

@quamrana: Funzionerebbe perfettamente per la situazione che ho descritto, ma il numero che leggerò non è necessariamente un int, e il lo stream di stringhe qui sotto andrà felicemente in int o double. Anche così, grazie mille. – physicsmichael