Если вызов ifstream::getline не находит разделитель, я знаю, что он устанавливает бит ошибки, но очищает ли он также буфер или оставляет буфер нетронутым и просто устанавливает бит ошибки, чтобы вы знали?
ifstream getline не находит разделитель
Ответы (2)
Кажется, существует некоторая путаница в отношении различных состояний входного потока (и это правильно, они запутаны):
Стандарт С++, таблица 124
badbit
указывает на потерю целостности входной или выходной последовательности (например, неисправимую ошибку чтения из файла);eofbit
указывает, что операция ввода достигла конца входной последовательности;failbit
указывает, что операции ввода не удалось прочитать ожидаемые символы или операции вывода не удалось сгенерировать нужные символы.
То есть failbit
устанавливается, когда basic_istream::getline(char_type* s, std::streamsize count, char_type delim)
извлекает count-1
символов без нахождения разделителя (-1
для завершающего \0
). Это не означает, что это поток bad
, а скорее указывает, что getline
не удалось найти разделитель.
Описание basic_istream::getline
в стандарте C++: [istream.unformatted]/18
- Effects: [...] After constructing a sentry object [= preparation for input and error checks], extracts characters and stores them into successive locations of an array whose first element is designated by
s
. Characters are extracted and stored until one of the following occurs:
- end-of-file occurs on the input sequence (in which case the function calls
setstate(eofbit)
);traits::eq(c, delim)
[= найден разделитель] для следующего доступного входного символаc
(в этом случае входной символ извлекается, но не сохраняется);n
меньше одного или сохраненоn - 1
символов (в этом случае функция вызываетsetstate(failbit)
). [...]- Эти условия проверяются в указанном порядке.
- Если функция не извлекает символы, она вызывает
setstate(failbit)
[...]- В любом случае, если
n
больше нуля, он сохраняет нулевой символ [...] в следующем последовательном месте массива.
[выделения и пропуски мои]
Из здесь:
Внутри функция обращается к входной последовательности, сначала создавая объект-сторож (с параметром noskipws равным true). Затем (если все в порядке) он извлекает символы из связанного с ним объекта потокового буфера, как если бы вызывал свои функции-члены sbumpc или sgetc, и, наконец, уничтожает объект-сторожевой перед возвратом.
Кажется, что буфер заполнен, пока есть проблема. (См. комментарии DyP)
getline
извлекает до некоторого условия, такого как конец файла; см. cppreference или Standard [istream.unformatted]/18. извлекается и сохраняется до тех пор, пока не произойдет одно из следующих событий:
- person dyp; 29.05.2013
badbit
(а вместе с ней и функция basic_ios::bad
) не указывает на конец файла (-> eofbit
).
- person dyp; 29.05.2013
failbit
. - person jrok   schedule 29.05.2013