Распознавание EOF по сравнению с новой строкой в getline в C

#c #newline #eof #getline

#c #новая строка #eof #getline

Вопрос:

есть ли какой-либо способ, как распознать, была ли getline завершена из-за новой строки или из-за EOF?

Итак, я хотел бы различать:

1. альфа n бета n gama n EOF

2. альфа n бета n gama EOF

Во втором случае я не хочу читать gama как новую строку, и я хочу сказать, что чтение последней строки не было успешным. Я использую while cycle для чтения строк.

Я не могу редактировать входящие данные.

Вероятно, есть возможность решить эту проблему с помощью getchar. Однако это усложняет чтение строк :-/

Большое вам спасибо

Комментарии:

1. Вы можете использовать feof функцию для проверки EOF в потоке, но она не вернется true до тех пор, пока вы не попытаетесь прочитать дальше конца файла.

2. прочитайте следующий символ с помощью fgetc, проверьте, соответствует ли его EOF, если нет, верните его обратно с помощью ungetc.

3. Я не уверен, почему вы не можете просто использовать getline . В обоих случаях вы будете получать строки обратно по одной за раз. Для EOF возвращаемое значение будет равно -1. Но вы не получите этого до четвертого вызова. В первом случае возвращаемая последовательность будет: 5,5,5,-1 , а во втором -: 5,5,4,-1 Только последняя строка может отличаться, и вы можете посмотреть на: buf[len - 1] == 'n' . Невозможно одновременно получить ненулевую длину и указание EOF в одном вызове.

Ответ №1:

Например fgets() , getline() включает завершающую новую строку в строку. Поэтому просто проверьте последний символ после успешного вызова, чтобы узнать, является ли он a 'n' . Если это что-то другое, у вас есть последняя строка файла без завершающей новой строки.

Комментарии:

1. Проверка последнего символа заслуживает подробностей. При getline() этом легко ошибиться с кодом, учитывая возврат -1 или чтение нулевых символов. fgets() имеет дополнительные случаи, которые затрудняют проверку последнего символа.

Ответ №2:

есть ли какой-либо способ, как распознать, была ли getline завершена из-за новой строки или из-за EOF?

Если ввод строки прекратился из-за конца файла, feof() возвращает true.

 ssize_t nread = getline(amp;line, amp;len, stream);
if (feof(stream)) {
  puts("Input ended due to end-of-file");
}
if (nread > 0 amp;amp; line[nread-1] == 'n') {
  puts("Input ended due to end-of-line");
}
 

Возможно, что оба значения будут ложными: ошибка ввода или сбой выделения.


Что касается fgets() , дополнительные проблемы возникают, когда буфер заполнен или был прочитан нулевой символ.

Ответ №3:

Спасибо за ваши советы.

Наконец, я использовал более простой способ, как это сделать.

characters = getline(amp;line, amp;len, stream);

if (characters==-1) {puts("Input ended by EOF after n");}

if (feof(stdin)) {puts("Input ended by just EOF");}

Комментарии:

1. После чтения некоторого ввода, а затем происходит конец файла, getline() не возвращает -1. Существует как минимум 4 причины getline() , по которым возвращает -1. Встречается EOF после того, как ни один другой ввод не является 1 из них.