2013-05-03 33 views
13

Próbuję wyszukać i ponownie odczytać dane. ale kod nie powiedzie się.Co jest nie tak z ifstream seekg

Kod jest

std::ifstream ifs (filename.c_str(), std::ifstream::in | std::ifstream::binary); 

std::streampos pos = ifs.tellg(); 

std::cout <<" Current pos: " << pos << std::endl; 

// read the string 
std::string str; 
ifs >> str; 

std::cout << "str: " << str << std::endl; 
std::cout <<" Current pos: " <<ifs.tellg() << std::endl; 

// seek to the old position 
ifs.seekg(pos); 

std::cout <<" Current pos: " <<ifs.tellg() << std::endl; 

// re-read the string 
std::string str2; 
ifs >> str2; 

std::cout << "str2: (" << str2.size() << ") " << str2 << std::endl; 
std::cout <<" Current pos: " <<ifs.tellg() << std::endl; 

Moje wejście plik testowy jest

qwe 

Wyjście było

Current pos: 0 
str: qwe 
Current pos: 3 
Current pos: 0 
str2: (0) 
Current pos: -1 

ktoś może mi powiedzieć co się stało?

+0

możliwe duplikat [seekg() funkcja nie] (http://stackoverflow.com/questions/11264764/seekg-function-fails) – amo

Odpowiedz

5

Wygląda na to, że czyta znaki, które uderza w EOF i zaznacza je w stanie strumienia. Stan strumienia nie zmienia się podczas wykonywania wywołania seekg(), więc następny odczyt wykrywa, że ​​bit EOF jest ustawiony i wraca bez czytania.

+5

Rozwiązaniem jest wywołanie 'ifs.clear()'. –

27

Po ukończeniu ifs >> str; kończy się plik eofbit.

Do czasu, gdy C++ 11, seekg() nie będzie szukał od końca strumienia (uwaga: rzeczywiście tak jest, ponieważ wynik to Current pos: 0, ale to nie jest dokładnie zgodne: powinien albo nie szukać, albo powinien wyczyścić eofbit i seek).

Albo sposób, aby obejść ten problem, można wykonać ifs.clear(); przed ifs.seekg(pos);