2013-05-03 73 views
13

我正在嘗試查找並重新讀取數據。但代碼失敗。ifstream有什麼問題seekg

的代碼是

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; 

我的輸入測試文件是

qwe 

產量爲

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

誰能告訴我有什麼不對?

+0

可能重複[seekg()函數將失敗(http://stackoverflow.com/questions/11264764/seekg-function-fails) – amo 2014-09-16 23:00:33

回答

5

它看起來像在讀取它正在擊中EOF的字符並將其標記爲流狀態。在執行seekg()調用時,流狀態不會更改,因此下一次讀取會檢測到EOF位已設置並在未讀取的情況下返回。

+5

解決的辦法是調用'ifs.clear()'。 – 2013-05-03 17:23:12

27

ifs >> str;因達到文件結束而結束時,它設置eofbit。

直到C++ 11,seekg()無法從流結束(注意:你實際上是這樣做的,因爲輸出是Current pos: 0,但這並不完全符合:它應該無法搜索或應該清除eofbit和尋求)。

無論哪種方式,要解決的是,你可以執行ifs.clear();ifs.seekg(pos);