Когда устанавливается eofbit?
От: neocpp  
Дата: 09.02.13 14:49
Оценка:
Добрый день. Имеется текстовый файл, в котором просто записано несколько чисел, например: 1 2 3 4

Читаю их таким образом:

int c;
while(!f.eof())
{
    f >> c;
    cout << c << " ";
}


Получаю: 1 2 3 4. Но, стоит заменить тип переменной на: char c; Вывод получается таким, с лишней цифрой: 1 2 3 4 4

Вопрос. Почему в первом случае eofbit установился раньше, сразу после чтения последней цифры? И что происходит во втором случае?
Re: Когда устанавливается eofbit?
От: Nikita.Trophimov  
Дата: 09.02.13 15:29
Оценка:
Он устанавливается только тогда, когда Вы попытаетесь прочитать уже не существующие данные, а не закончите читать последнюю переменную.
Re[2]: Когда устанавливается eofbit?
От: neocpp  
Дата: 09.02.13 16:00
Оценка:
Здравствуйте, Nikita.Trophimov, Вы писали:

NT>Он устанавливается только тогда, когда Вы попытаетесь прочитать уже не существующие данные, а не закончите читать последнюю переменную.


Я тоже так думал, но почему в первом случае цикл отрабатывает нормально? Т.е. считалась последняя цифра и условие f.eof() тут же стало истинным.
Re[3]: Когда устанавливается eofbit?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 09.02.13 16:10
Оценка:
Здравствуйте, neocpp, Вы писали:

N>Здравствуйте, Nikita.Trophimov, Вы писали:


NT>>Он устанавливается только тогда, когда Вы попытаетесь прочитать уже не существующие данные, а не закончите читать последнюю переменную.


N>Я тоже так думал, но почему в первом случае цикл отрабатывает нормально? Т.е. считалась последняя цифра и условие f.eof() тут же стало истинным.

Думаю, потому, что считываются не цифры, а числа, и считывание последнего числа заканчивается в момент. когда в файл закончился. Попробуй после 4 в исходном файле пробел поставить, по идее поведение станет одинаковым с вариантом char
Маньяк Робокряк колесит по городу
Re[4]: Когда устанавливается eofbit?
От: neocpp  
Дата: 09.02.13 16:37
Оценка:
Здравствуйте, Marty, Вы писали:

M>Думаю, потому, что считываются не цифры, а числа, и считывание последнего числа заканчивается в момент. когда в файл закончился. Попробуй после 4 в исходном файле пробел поставить, по идее поведение станет одинаковым с вариантом char


Да, с пробелом работает аналогично char. Только я не пойму почему так? И все еще не могу понять, в какой именно момент устанавливается eofbit?

Предположение: он устанавливается после последнего успешного чтения, а при последующей попытке чтения устанавливается failbit. Почему тогда в случае char eofbit устанавливается позже? То есть уже после неудачной попытки чтения.
Re[5]: Когда устанавливается eofbit?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 09.02.13 18:28
Оценка:
Здравствуйте, neocpp, Вы писали:

M>>Думаю, потому, что считываются не цифры, а числа, и считывание последнего числа заканчивается в момент. когда в файл закончился. Попробуй после 4 в исходном файле пробел поставить, по идее поведение станет одинаковым с вариантом char


N>Да, с пробелом работает аналогично char. Только я не пойму почему так? И все еще не могу понять, в какой именно момент устанавливается eofbit?


N>Предположение: он устанавливается после последнего успешного чтения, а при последующей попытке чтения устанавливается failbit. Почему тогда в случае char eofbit устанавливается позже? То есть уже после неудачной попытки чтения.


А если еще немного подумать?
eofbit — признак того, что достигнут конец файла.
failbit — признак того, что произошла ошибка ввода-вывода, к твому вопросу, думаю, он не имеет отношения.

При чтении int'а что происходит? Считываются символы до пробельного или до конца файла, считанные символы преобразовываются в int. Поэтому при добавлении пробела поведение изменилось — последнее (четвертое) число считано, ввод остановился, конец файла не достинут. Если нет пробела, ввод останавливается при достижении конца файла, в этот момент устанавливается eofbit. При каждом чтении int'а может быть считано от 0 до N байт. При чтении посимвольно четыре раза считывается по одному байту (символу), при этом до конца файла еще не дошли. При попытке чтения пятого символа обнаруживается, что достигнут конец файла и только в этот устанавливается eofbit.
Маньяк Робокряк колесит по городу
Re[6]: Когда устанавливается eofbit?
От: LaptevVV Россия  
Дата: 10.02.13 04:07
Оценка:
Здравствуйте, Marty, Вы писали:

N>>Предположение: он устанавливается после последнего успешного чтения, а при последующей попытке чтения устанавливается failbit. Почему тогда в случае char eofbit устанавливается позже? То есть уже после неудачной попытки чтения.


M>А если еще немного подумать?

M>eofbit — признак того, что достигнут конец файла.
M>failbit — признак того, что произошла ошибка ввода-вывода, к твому вопросу, думаю, он не имеет отношения.
Имеет. Когда читается поток ввода при вводе int, то failbit устанавливается при обнаружении символа,
не соответствующего символам целого числа, то есть — не цифре.
При обнаружении пробела после числа он и устанавливается.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.