#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 из них.