Что такое 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-->
обратная совместимость с CP / M. файловая система CP/M записала только длины файлов в кратных 128-байтовых "записях", поэтому условно символ Control-Z использовался для обозначения конца значимых данных, если он заканчивался в середине записи. Файловая система MS-DOS всегда записывала точную длину байта файлов, поэтому в MS-DOS это никогда не было необходимо.
Это позволяет программам использовать один и тот же код для чтения ввода с терминала и текстовый файл.
#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.