Перемотать объект ifstream после достижения конца файла

Имея текстовый файл с несколькими символами (скажем, 10), вы можете попробовать прочитать из него 1000 символов.

char *buf = new char[1000];
ifstream in("in.txt");
in.read(buf, 1000);

Это, конечно же, установит флаг eofbit (и флаг failbit тоже), однако вы сможете получить нужные символы.

Теперь предположим, что вы хотите снова прочитать файл (с самого начала):

in.seekg(0);        // Sets input position indicator. 
in.read(buf, 100);  // Try to read again.

Это не работает: потому что, если вы позвоните:

int count = in.gcount()  // Charecters readed from input.

вы заметите, что count == 0. То есть вообще ничего не читал.

Отсюда вопрос: Как можно перемотать файл после того, как вы дошли до конца файла?


person Raydel Miranda    schedule 04.02.2015    source источник


Ответы (1)


Решение

Используйте clear для очистки состояния ifstream перед вызовом seekg. Не забудьте проверить сначала, если вам не понадобится знать состояние позже.

in.clear();
in.seekg(0);

Объяснение

seekg устанавливает позицию курсора, но не очищает< /strong> бит состояния failbit, поэтому ifstream считает, что что-то еще не так.

Из стандартной спецификации:

std::basic_istream::seekg ведет себя как UnformattedInputFunction , за исключением того, что gcount() не затрагивается.

И мы можем прочитать в UnformattedInputFunction:

Следующие стандартные библиотечные функции являются UnformattedInputFunctions:

basic_istream::seekg, за исключением того, что сначала очищает eofbit и не изменяет gcount

В примере вопроса, если вы печатаете состояние до и после поиска, вы получаете:

cout << "State before seekg: " << in.rdstate() << endl;   // Prints 3 (11 in binary) failbit and eofbit activated.
in.seekg(0);
cout << "State after seekg: " << in.rdstate() << endl;    // Prints 2 (10 in binary) just failbit activated.

Поэтому!!

seekg не очищает failbit и по некоторым причинам реализации не t работает с таким активированным битом.

Мое предположение

Почему seekg не работает, когда активирован failbit?

Это связано с тем, что этот бит активируется не только тогда, когда поток достигает конца файла. И это могут быть ситуации, в которых после активации failbit использование seekg подвержено ошибкам или может показывать неопределенное поведение.

person Raydel Miranda    schedule 04.02.2015