Что "может произойти" с fgets
?
- , возвращается
NULL
при ошибке ввода - , возвращается
NULL
, когда находит EOF
перед любыми "настоящими" символами - возвращает указатель на буфер
- буфер не был полностью заполнен
- буфер был полностью заполнен, но больше нетданные на входе
- буфер полностью заполнен и на входе больше данных
Как можно различить 1
и 2
?
с feof
Как можно различить 3.1.
, 3.2.
и 3.3.
Определяя, где были записаны завершающий нулевой байт и разрыв строки:
Если выводбуфер имеет значение '\n'
, тогда больше нет данных (возможно, буфер был полностью заполнен)
Если нет '\n'
AND , то '\0'
находится в последней позиции буфератогда вы знаете, что ожидается больше данных;если '\0'
находится перед последней позицией буфера, вы нажали EOF
в потоке, который не заканчивается разрывом строки.
вот так
/* fgets fun */
/*
char buf[SOMEVALUE_LARGERTHAN_1];
size_t buflen;
*/
if (fgets(buf, sizeof buf, stdin)) {
buflen = strlen(buf);
if (buflen) {
if (buf[buflen - 1] == '\n') {
puts("no more data (3.1. or 3.2.)"); /* normal situation */
} else {
if (buflen + 1 == sizeof buf) {
puts("more data waiting (3.3.)"); /* long input line */
} else {
puts("EOF reached before line break (3.1.)"); /* shouldn't happen */
}
}
} else {
puts("EOF reached before line break (3.1.)"); /* shouldn't happen */
}
} else {
if (feof(stdin)) {
puts("EOF reached (2.)"); /* normal situation */
} else {
puts("error in input (1.)");
}
}
Обычные, неполные тесты: buf[buflen - 1] == '\n'
и проверка fgets
возвращаемого значения ...
while (fgets(buf, sizeof buf, stdin)) {
if (buf[strlen(buf) - 1] != '\n') /* deal with extra input */;
}