eof oftream в C ++ - PullRequest
       60

eof oftream в C ++

3 голосов
/ 11 января 2012
bool ios::eof ( ) const;

По данным библиотеки,

Функция возвращает true, если флаг ошибки потока eofbit был устанавливается предыдущей операцией ввода / вывода. Этот флаг установлен всеми стандартами операции ввода при достижении конца файла в последовательности связанный с потоком.

Я написал программу для запуска некоторых тестов:

int main(int argc, char *argv[])
{
    ifstream ifs(argv[1]);
    float f;
    ifs >> f;

    cout << ifs.eof() << endl; //check if eofbit set

    ifs.close();
}

Я протестировал 2 файла, testcase1.txt и testcase2.txt.

testcase1.txt был сгенерирован в терминале с cat, [Ctrl-D] использовался для завершения ввода:

[~/C++ $] cat > testcase1.txt
1.234[Ctrl-D]

testcase2.txt был сгенерирован в vim, я открыл vim и только что набрал 1.234, а затем сохранил и вышел.

Результат теста

Результат теста с testcase1.txt равен 1, что означает, что eofbit установлен,

[~/C++ $] ./a.out testcase1.txt
1

Результат теста с testcase2.txt равен 0,

[~/C++ $] ./a.out testcase2.txt
0

Я открываю оба testcase1.txt и testcase2.txt в vim, они выглядят точно так же, тогда почему eofbit не был установлен для testcase2.txt?

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Как вы видите в комментарии, появилась новая строка:

ifstream ifs(argv[1]);
float f;
ifs >> f;
char c;
ifs.get( c ); // this will get '\n'

Тем не менее, EOF все равно не установится .... Прочитайте параграф, который вы цитировали снова:

Функция возвращает true, если флаг ошибки потока eofbit был установлен предыдущей операцией ввода-вывода .Этот флаг устанавливается всеми стандартными операциями ввода при достижении конца файла в последовательности, связанной с потоком.

Чтобы установить бит eof, необходимо прочитать PASS eof.Вы можете использовать peek(), чтобы сделать это, если хотите.

ifstream ifs(argv[1]);
float f;
ifs >> f;
char c;
ifs.get( c ); // this will get '\n'
ifs.eof();  // this is false;
ifs.peek();
ifs.eof(); // this is true

См. Также: istream :: peek любопытное поведение в отношении.EOF

2 голосов
/ 11 января 2012

vim собирается добавить новую строку в конец файла.Вот почему EOF не достигается.

...