Что такое EOF на языке программирования C?

Как вы получаете, чтобы увидеть последний отпечаток? Другими словами, что поставить для EOF? Я проверил определения, и он говорит, что EOF равен -1.

и если вы введете Ctrl-D, вы ничего не увидите.

#include <stdio.h>

int main() {
 int c;
 while((c = getchar() != EOF)) {
  printf("%dn", c);
 }
 printf("%d - at EOFn", c);
}

9 ответов


в системах Linux и OS X символ для ввода, чтобы вызвать EOF, является Ctrl-D. Для Windows, это Ctrl-Z.

в зависимости от операционной системы этот символ будет работать, только если это первый символ в строке, т. е. первый символ после Enter. Поскольку консольный ввод часто ориентирован на линию, система также может не распознавать символ EOF до тех пор, пока вы не выполните Enter.

и да, если этот символ распознается как EOF, то ваша программа никогда не увидит фактический символ. Вместо этого программа C получит -1 с getchar().


вы должны изменить скобки на

while((c = getchar()) != EOF)

потому что " = " - оператор имеет более низкий приоритет, чем "!=" оператор. Тогда вы получите ожидаемые результаты. Ваше выражение равно

while (c = (getchar()!= EOF))

вы получаете два 1 в качестве вывода, потому что вы делаете сравнение "c!=ВФ." Это всегда будет один для символа, который вы ввели, а затем "\n", который следует, нажав return. За исключением последнего сравнения, где c действительно является EOF, он будет ставлю 0.

EDIT about EOF: EOF обычно равен -1, но это не гарантируется стандартом. Стандарт определяет только о EOF в разделе 7.19.1:

EOF, который расширяется до целого числа постоянное выражение, с типом int и отрицательное значение, возвращаемое несколько функций для указания конец файла, то есть, больше нет ввода из ручья;

разумно предположить, что EOF равен -1, но при использовании EOF вы не следует тестировать против определенного значения, а скорее использовать макрос.


значение EOF является отрицательным целым числом, чтобы отличить его от значений "char", которые находятся в диапазоне от 0 до 255. Обычно это -1, но это может быть любое другое отрицательное число ... согласно спецификациям POSIX, поэтому вы не должны предполагать, что это -1.

символ ^D-это то, что вы вводите в поток консоли в UNIX/Linux, чтобы сказать ему логически завершить входной поток. Но в других контекстах (например, когда вы читаете из файла) это просто еще один символ данных. Так или иначе, ^Д символ (то есть конец ввода) никогда не попадает в код приложения.

как говорит @ Bastien, EOF также возвращается, если getchar() не удается. Строго говоря, вы должны позвонить ferror или feof чтобы увидеть, представляет ли EOF ошибку или конец потока. Но в большинстве случаев ваша заявка будет делать то же самое в любом случае.


EOF означает конец файла. Это знак того, что конец файла достигнут, и что данных больше не будет.

Edit:

Я исправлюсь. В данном случае это не конец файла. Как уже упоминалось, он передается при передаче CTRL+d (linux) или CTRL+z (windows).


пару опечаток:

while((c = getchar())!= EOF)

на месте:

while((c = getchar() != EOF))

также getchar () обрабатывает ключ возврата как допустимый вход, поэтому вам также нужно буферизировать его.EOF-маркер для указания конца ввода. Как правило, это int со всеми битами.


#include <stdio.h>
int main()
{
 int c;
 while((c = getchar())!= EOF)
 {
  if( getchar() == EOF )
    break;
  printf(" %d\n", c);
 }
  printf("%d %u %x- at EOF\n", c , c, c);
}

принты:

49
50
-1 4294967295 ffffffff- at EOF

для ввода:

1
2
<ctrl-d>

nput с терминала никогда не "заканчивается" (если устройство не отключено), но полезно ввести более одного "файла" в терминал, поэтому последовательность ключей зарезервирована для указания конца ввода. В UNIX перевод нажатия клавиши на EOF выполняется драйвером терминала, поэтому программе не нужно отличать терминалы от других входных файлов. По умолчанию драйвер преобразует символ Control-D в начале строки в индикатор конца файла. Чтобы вставить фактический Символ Control-D (ASCII 04) во входной поток, пользователь предшествует ему символом команды "quote" (обычно Control-V). AmigaDOS похож, но использует Control - \ вместо Control-D.

в DOS и Windows Microsoft (и в CP/M и многих операционных системах DEC) чтение с терминала никогда не будет производить EOF. Вместо этого программы распознают, что источником является терминал (или другое "символьное устройство") , и интерпретируют данный зарезервированный символ или последовательность как конец файла индикатор; чаще всего это ASCII Control-Z, код 26. Некоторые программы MS-DOS, включая части оболочки Microsoft MS-DOS (COMMAND.COM) и утилиты операционной системы (например, EDLIN), обрабатывают элемент управления-Z в текстовом файле как маркировку конца значимых данных и/или добавляют элемент управления-Z к концу при записи текстового файла. Это было сделано по двум причинам:--1-->

  1. обратная совместимость с CP / M. файловая система CP/M записала только длины файлов в кратных 128-байтовых "записях", поэтому условно символ Control-Z использовался для обозначения конца значимых данных, если он заканчивался в середине записи. Файловая система MS-DOS всегда записывала точную длину байта файлов, поэтому в MS-DOS это никогда не было необходимо.

  2. Это позволяет программам использовать один и тот же код для чтения ввода с терминала и текстовый файл.


#include <stdio.h>

int main() {
    int c;
    while((c = getchar()) != EOF) { //precedence of != is greater than =, so use braces
        printf("%d\n", c);
    }
    printf("%d - at EOF\n", c);
}

Я думаю, что это правильный способ проверить значение EOF. И я проверил выход.

для ввода: abc и Enter я получил вывод: 97 98 99 10. ( ASCII значения)

для ввода Ctrl - D я получил вывод: -1-at EOF. Поэтому я думаю, что значение -1 для EOF.

попробуйте другие входы вместо Ctrl-D, например Ctrl-Z. Я думаю, что он варьируется от компилятора к компилятору.


#include <stdio.h>

int main() {
    int c;
    while((c = getchar()) != EOF) { 
        putchar(c);
    }    
    printf("%d  at EOF\n", c);
}

изменен приведенный выше код, чтобы дать больше ясности на EOF, нажмите Ctrl+d и putchar используется для печати char избегайте использования printf в цикле while.


int c;

while((c = getchar())!= 10)
{
    if( getchar() == EOF )
        break;

     printf(" %d\n", c);
}