ifstream getline не находит разделитель

Если вызов ifstream::getline не находит разделитель, я знаю, что он устанавливает бит ошибки, но очищает ли он также буфер или оставляет буфер нетронутым и просто устанавливает бит ошибки, чтобы вы знали?


person csteifel    schedule 29.05.2013    source источник
comment
Он оставляет буфер нетронутым, содержащим то, что было извлечено до установки failbit.   -  person jrok    schedule 29.05.2013


Ответы (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:
    1. end-of-file occurs on the input sequence (in which case the function calls setstate(eofbit));
    2. traits::eq(c, delim) [= найден разделитель] для следующего доступного входного символа c (в этом случае входной символ извлекается, но не сохраняется);
    3. n меньше одного или сохранено n - 1 символов (в этом случае функция вызывает setstate(failbit)). [...]
  • Эти условия проверяются в указанном порядке.
  • Если функция не извлекает символы, она вызывает setstate(failbit) [...]
  • В любом случае, если n больше нуля, он сохраняет нулевой символ [...] в следующем последовательном месте массива.

[выделения и пропуски мои]

person dyp    schedule 29.05.2013

Из здесь:

Внутри функция обращается к входной последовательности, сначала создавая объект-сторож (с параметром noskipws равным true). Затем (если все в порядке) он извлекает символы из связанного с ним объекта потокового буфера, как если бы вызывал свои функции-члены sbumpc или sgetc, и, наконец, уничтожает объект-сторожевой перед возвратом.

Кажется, что буфер заполнен, пока есть проблема. (См. комментарии DyP)

person Djon    schedule 29.05.2013
comment
Я пытаюсь получить больше информации об этом поведении, но, насколько я понимаю, я бы сказал, что оно оставляет его нетронутым. - person Djon; 29.05.2013
comment
я так не думаю?? Часовой объект должен проверить, хороший ли поток или нет; getline извлекает до некоторого условия, такого как конец файла; см. cppreference или Standard [istream.unformatted]/18. извлекается и сохраняется до тех пор, пока не произойдет одно из следующих событий: - person dyp; 29.05.2013
comment
Функция badbit (а вместе с ней и функция basic_ios::bad) не указывает на конец файла (-> eofbit). - person dyp; 29.05.2013