2012-04-13 7 views
6

Me gustaría saber si y por qué se supone que seekg(0) no borra el eofbit de una secuencia. Estoy en un punto donde ya he leído toda la secuencia, así se ha alcanzado EOF (pero no failbit todavía está configurado) y quiero volver con seekg() a una posición válida y leer algunos caracteres otra vez. En este caso, seekg(0) parece "funcionar" con el conjunto eofbit, pero tan pronto como intento leer de la secuencia, se establece el failbit. ¿Es esta lógica, correcta o es incorrecta mi implementación? ¿Se supone que debo reconocer este caso y borrar el eofbit manualmente (si el failbit no está configurado)?¿Por qué no seekg (0) borra el estado eof del flujo?

EDIT:

el siguiente programa proporcionado por un lector da resultados diferentes en mi aplicación (. Mingw32-C++ exe (TDM-2 mingw32) 4.4.1):

#include <sstream> 
#include <iostream> 
#include <string> 

int main() { 
     std::istringstream foo("AAA"); 
     std::string a; 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 
     foo.seekg(0); 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 0 0 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 1 
} 

Los comentarios anteriores son del usuario que probó ese programa en su implementación. Puedo obtener estos resultados:

1 0 
1 0 
1 1 
1 1 
+0

Sí, tiene que restablecer manualmente el estado de la corriente. –

+0

@Martin: parece ser el viejo estándar frente a un nuevo problema estándar. – Anonymous

Respuesta

2

De acuerdo con la nueva estándar clear() se supone que restablecer el eofbit (§ 27.7.2.3):

basic_istream<charT,traits>& seekg(pos_type pos);

Efectos: se comporta como una función de entrada sin formato ..., salvo que la función se borra primero eofbit ...

B ut en el antiguo estándar (§27.6.1.3) no hay mención de borrar el eofbit!

Y una prueba sencilla:

#include <sstream> 
#include <iostream> 
#include <string> 

int main() { 
     std::istringstream foo("AAA"); 
     std::string a; 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 
     foo.seekg(0); 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 0 0 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 1 
} 
+0

después de su primer foo.seekg (0), el eofbit se borra en su ejemplo, mientras todavía está activo en mi implementación. Por eso preguntaba si algo extraño podría suceder. Su programa da 1 0, 1 0, 1 1, 1 1 – Martin

+0

@Martin: Buen punto. ¿Qué compilador y qué entorno? Obtengo los resultados publicados con: 'clang 3.1',' gcc 4.7.0' y 'gcc 4.6.3' (con y sin' -std = C++ 0x'). Sin embargo, con 'VS2010' obtengo el mismo resultado que tú. – Anonymous

+0

Un poco viejo [documento] (http://support.microsoft.com/kb/146445) de Microsoft puede arrojar algo de luz sobre el tema. ** Estado: ** _Este comportamiento es por diseño._ ¿Y el estándar ...? – Anonymous

0

¿Por qué no claras manualmente() la corriente y luego volver una vez que el eofbit se ha fijado? Se ha llegado a EOF, ¿por qué debería buscar limpiarlo automáticamente? Hacer eso parecería causar más problemas.

Cuestiones relacionadas