2010-05-06 11 views
8

Ogni volta che ho letto in fstream ho ottenuto 1 carattere extra alla fine, come posso evitare questo?C++: Ogni volta che ho letto da fstream ho ottenuto 1 carattere extra alla fine

EDIT:

ifstream readfile(inputFile); 
ofstream writefile(outputFile); 
char c; 
while(!readfile.eof()){ 
     readfile >> c; 
     //c = shiftChar(c, RIGHT, shift); 
     writefile << c; 
} 
readfile.close(); 
writefile.close(); 
+3

pubblicare il codice che causa il problema. Immagino che tu abbia aperto il file in modalità testo (piuttosto che binario) e stai provando a leggerlo con read(), ma chissà. –

+0

Il codice effettivo sarebbe d'aiuto. Questo potrebbe essere il carattere di nuova riga ('\ n')? – Dima

+1

sorry guys, basta aggiornare il mio post –

risposta

6

Questo in genere si traduce dal test per la fine del file in modo non corretto. Normalmente si vuole fare qualcosa di simile:

while (infile>>variable) ... 

o:

while (std::getline(infile, whatever)) ... 

ma NON:

while (infile.good()) ... 

o:

while (!infile.eof()) ... 

Edit: I primi due fanno un leggere, controllare se non ha funzionato, e in tal caso uscire ciclo continuo. Gli ultimi due tentano una lettura, elaborano ciò che è stato "letto" e quindi escono dal ciclo sullo successiva iterazione se il tentativo precedente non è riuscito.

Edit2: per copiare un file all'altro con facilità, è possibile utilizzare qualcosa di simile:

// open the files: 
ifstream readfile(inputFile); 
ofstream writefile(outputFile); 

// do the copy: 
writefile << readfile.rdbuf(); 
+0

Puoi spiegare perché gli ultimi 2 sono sbagliati? –

+0

fantastico !! questo risolve il problema U potrebbe approfondire perché '.eof()' non è una buona idea? –

+0

Vedi la sua prima modifica. –

0

In base al codice, appare quello che stai cercando di fare è copiare il contenuto di un file all'altro ?

Se è così, mi piacerebbe provare qualcosa di simile:

ifstream fin(inputFile, ios::binary); 

fin.seekg(0, ios::end); 
long fileSize = fin.tellg(); 
fin.seekg(0, ios::beg); 

char *pBuff = new char[fileSize]; 
fin.read(pBuff, fileSize); 
fin.close(); 

ofstream fout(outputFile, ios::binary) 
fout.write(pBuff, fileSize); 
fout.close; 
delete [] pBuff; 
Problemi correlati