2010-05-06 6 views
8

Cada vez que leo por fstream obtengo 1 carácter extra al final, ¿Cómo puedo evitar esto?C++: Cada vez que leo por fstream obtengo 1 carácter extra al final

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

enviar el código que causa el problema. Supongo que habrá abierto el archivo en modo texto (en lugar de binario) y está tratando de leerlo con read(), pero quién sabe. –

+0

El código real ayudaría. ¿Podría ser este el carácter de nueva línea ('\ n')? – Dima

+1

perdón chicos, solo actualicen mi publicación –

Respuesta

6

Esto típicamente resulta de pruebas para el final del archivo de forma incorrecta. Normalmente se desea hacer algo como:

while (infile>>variable) ... 

o:

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

pero NO:

while (infile.good()) ... 

o:

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

Editar: Los dos primeros hacen una leer, verificar si falló, y si es así salir de lazo. Los dos últimos intentan leer, procesar lo que se "leyó" y luego salir del ciclo en la siguiente iteración si el intento anterior falló.

Edit2: para copiar un archivo a otro con facilidad, considere el uso de algo como esto:

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

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

¿Pueden explicar por qué los 2 últimos son incorrectos? –

+0

impresionante !! eso soluciona el problema U podría explicar por qué '.eof()' no es una buena idea. –

+0

Ver su primera edición. –

0

Basado en el código, parece ser lo que estás tratando de hacer es copiar el contenido de un archivo a otro ?

Si es así, me gustaría probar algo como esto:

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; 
Cuestiones relacionadas