Я прочитал вопрос о переполнении стека, где установлен 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 и неудачный, а другой нет? Ответ в другом потоке гласит: "Всякий раз, когда вы сталкиваетесь с окончанием файла, не пытаясь его прочитать". читать за ним? Что это значит?
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
это точное количество символов.