Подтвердить что ты не робот

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

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

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

#include <stdio.h>

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

Ответ 1

В системах Linux и OS X символом ввода для создания EOF является Ctrl - D. Для Windows это Ctrl - Z.

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

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

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Edit:

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

Ответ 5

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

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>

Ответ 6

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

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

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

      
  • Он позволяет программам использовать один и тот же код для чтения ввода как с терминала, так и с текстового файла.

      

Ответ 7

#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. И я проверил вывод.

Для INPUT: abc и Enter Я получил OUTPUT: 97 98 99 10. (значения ASCII)

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

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

Ответ 8

для простоты: EOF является целочисленным типом со значением -1. Поэтому мы должны использовать целочисленную переменную для проверки EOF.

Ответ 9

#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.

Ответ 10

int c;

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

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