C ++ Novellino: Passaggio di un fstream a una funzione per leggere i dati
Domanda
Ho un file di testo denominato num.txt
il cui unico contenuto è la linea 123
. Poi ho il seguente:
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? Sto facendo questo perché alt_reader
ha davvero molto di più ad esso, ma questa è la parte che mi sono bloccato su. Grazie mille per l'aiuto.
UPDATE: Utilizzando 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. Eventuali critiche con quello che c'è ora?
Soluzione
La prima volta che è stata stampata la variabile, è stampato come un char *
, la stampa di trattare il file come un file di testo (E sei fortunato tu non arresto). La seconda volta stampata, è reinterpretato come un int
, rendendo la rappresentazione completamente diversa.
Ogni volta che si lanci puntatori da un tipo a un altro tipo si sono di solito invocando un comportamento indefinito. Dal momento che non ha alcuna relazione char
standard per int
, lo avete 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"
}
Altri suggerimenti
Hai almeno due problemi qui.
In main ():
- Si dovrebbe essere passa un buffer di stringa in
alt_reader
, invece si sta passando un int. - sembrano voler leggere il
'123'
stringa, ma vuole un int per avere il valore di123
.
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;
}
Si noti che ho aggiunto al line[3]=0;
alt_reader
e atoi
fa la conversione da stringa ( a SCII) per int.