2012-04-13 14 views
6

Vorrei sapere se e perché seekg(0) non è in grado di cancellare lo eofbit di un flusso. Sono in un punto in cui ho già letto tutto lo stream, quindi è stato raggiunto EOF (ma non è stato impostato failbit) e voglio tornare indietro con seekg() in una posizione valida e leggere nuovamente alcuni caratteri. In questo caso, seekg(0) sembra "funzionare" con il set eofbit, ma non appena provo a leggere dallo stream, viene impostato il failbit. Questa logica è corretta o la mia implementazione è errata? Dovrei riconoscere questo caso e cancellare manualmente l'eofbit (se il failbit non è impostato)?Perché non seekg (0) cancella lo stato di eof di streaming?

EDIT:

Il programma segue fornita da un lettore dà risultati diversi a mia implementazione (. 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 
} 

Le osservazioni di cui sopra provengono dall'utente che ha provato quel programma nella sua implementazione. Ottengo questi risultati:

1 0 
1 0 
1 1 
1 1 
+0

Sì, è necessario reimpostare manualmente lo stato del flusso. –

+0

@Martin: sembra essere il vecchio standard rispetto al nuovo problema standard. – Anonymous

risposta

2

Secondo il nuova standard di clear() si suppone per ripristinare il eofbit (§ 27.7.2.3):

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

Effetti: si comporta come una funzione di ingresso non formattato ..., tranne che la funzione prima cancella eofbit ...

B ut nello standard vecchio (§ 27.6.1.3) non si fa menzione del clearing dello eofbit!

E un semplice test:

#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

dopo il primo foo.seekg (0), l'eofbit viene cancellato nell'esempio, mentre è ancora attivo nella mia implementazione. Era per questo che stavo chiedendo che potesse accadere qualcosa di strano. Il tuo programma dà 1 0, 1 0, 1 1, 1 1 – Martin

+0

@ Martin: buon punto. Quale compilatore e quale ambiente? Ottengo i risultati pubblicati con: 'clang 3.1',' gcc 4.7.0' e 'gcc 4.6.3' (con e senza' -std = C++ 0x'). Tuttavia con 'VS2010' ottengo lo stesso risultato di te. – Anonymous

+0

Un po 'vecchio [documento] (http://support.microsoft.com/kb/146445) di Microsoft potrebbe far luce sul problema. ** Stato: ** _Questo comportamento è di progettazione._ E lo standard ...? – Anonymous

0

Perché non solo cancellare manualmente() lo stream quindi tornare indietro una volta impostato l'eofbit? EOF è stato raggiunto, perché dovrebbe essere chiarito automaticamente? Fare ciò sembrerebbe causare più problemi.

Problemi correlati