Что такое 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);
}
Ответы
Ответ 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);
}