C ++ istream EOF не гарантирует failbit?

0

Я прочитал вопрос о переполнении стека, где установлен eofbit для file istream, но failbit нет. В этом случае файл имеет значение true, а file.eof() - true, а file.good() - false. Например, файл размером в один байт:

ifstream file("one.txt");
assert( file.is_open() );
for( int i = 0; i < 2; ++i )
{
    char chars[255] = {0};
    file.getline(chars, 2);
    //file.read( chars, 2 );

    cout << "file: " << !!file << endl;
    cout << "good: " << file.good() << endl;
    cout << "eof: " << file.eof() << endl;
    cout << "fail: " << file.fail() << endl;
    cout << "bad: " << file.bad() << endl;
    cout << endl;
}

Это результат:

file: 1
good: 0
eof: 1
fail: 0
bad: 0

file: 0
good: 0
eof: 1
fail: 1
bad: 0

Если я прокомментирую getline() и использую read(), я получаю следующее:

file: 0
good: 0
eof: 1
fail: 1
bad: 0

file: 0
good: 0
eof: 1
fail: 1
bad: 0

В обоих случаях я читаю конец файла в первой итерации цикла. Почему один EOF и неудачный, а другой нет? Ответ в другом потоке гласит: "Всякий раз, когда вы сталкиваетесь с окончанием файла, не пытаясь его прочитать". читать за ним? Что это значит?

Теги:
eof

1 ответ

3
Лучший ответ

eofbit устанавливается методом getline если он перестает читать, потому что он попадает в конец потока (файла), а не путем поиска символа разделителя. getline не устанавливает в этом случае failbit, что логично, потому что оно не сработало: оно прочитало некоторые данные.

Как только eofbit установлен, следующая операция чтения в этом потоке будет устанавливать failbit, потому что внутренняя функция часового failbit, вызываемая в начале почти каждой операции ввода, будет устанавливать failbit если установлен eofbit.

В общем случае eofbit "указывает, что операция ввода достигла конца входной последовательности", в то время как failbit "указывает, что операция ввода не смогла прочитать ожидаемые символы" (оба кавычка взяты из стандарта C++, раздел [ios.types], §27.5.3.1, таблица 124, в последнем черновике, который я лежал.) Как показывает пример getline, вполне возможно, что операция ввода будет считывать конец входной последовательности, все еще читая что-то.

Другой, несколько менее формальный и, возможно, неверный способ рассмотрения этого eofbit заключается в том, что eofbit устанавливается, если операция чтения достигла конца файла, тогда как failbit устанавливается, если операция чтения не может прочитать минимальное количество символов. 2 в вызовах getline и read означают разные вещи; в getline это максимальное количество символов для операции ввода (минимальное число равно 1); в случае read это точное количество символов.

  • 0
    Спасибо за ваш подробный ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню