Что не так с поиском ifstream - программирование
Подтвердить что ты не робот

Что не так с поиском ifstream

Я пытаюсь выполнить поиск и перечитывать данные. но код не работает.

Код

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

Может ли кто-нибудь сказать мне, что случилось?

4b9b3361

Ответ 1

Когда ifs >> str; заканчивается, потому что конец файла достигнут, он устанавливает eofbit.

До тех пор, пока С++ 11, seekg() не сможет отскочить от конца потока (обратите внимание: на самом деле, у вас есть, так как вывод Current pos: 0, но это не совсем соответствует: он должен либо не искать, либо должен очистить eofbit и искать).

В любом случае, чтобы обойти это, вы можете выполнить ifs.clear(); до ifs.seekg(pos);

Ответ 2

Похоже, что при чтении символов он попадает в EOF и отмечает это в состоянии потока. Состояние потока не изменяется при выполнении вызова seekg(), и поэтому следующее чтение обнаруживает, что бит EOF установлен и возвращается без чтения.