I am trying to do a seek and re-read the data. but the code fails.
The code is
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;
My input test file is
qwe
The output was
Current pos: 0
str: qwe
Current pos: 3
Current pos: 0
str2: (0)
Current pos: -1
Can anyone tell me what's wrong?
When ifs >> str;
ends because the end of file is reached, it sets the eofbit.
Until C++11, seekg()
could not seek away from the end of stream (note: yours actually does, since the output is Current pos: 0
, but that's not exactly conformant: it should either fail to seek or it should clear the eofbit and seek).
Either way, to work around that, you can execute ifs.clear();
before ifs.seekg(pos);
It looks like in reading the characters it is hitting the EOF and marking that in the stream state. The stream state is not changed when doing the seekg() call and so the next read detectes that the EOF bit is set and returns without reading.
来源:https://stackoverflow.com/questions/16364301/whats-wrong-with-the-ifstream-seekg