Я пытаюсь сделать поиск и перечитать данные. но код не работает.
Код
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
Может кто-нибудь сказать мне, что не так?
когда ifs >> str;
заканчивается, потому что достигнут конец файла, он устанавливает eofbit.
До C ++ 11, seekg()
не может искать от конца потока (примечание: ваш действительно делает, так как вывод Current pos: 0
, но это не совсем соответствует: он должен либо не искать, либо очищать eofbit и искать).
В любом случае, чтобы обойти это, вы можете выполнить ifs.clear();
до ifs.seekg(pos);
Похоже, что при чтении символов он попадает в EOF и помечает его в состоянии потока. Состояние потока не изменяется при выполнении вызова seekg (), поэтому при следующем чтении обнаруживается, что бит EOF установлен, и возвращается без чтения.