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

Существует открытое и свободное John Превосходный человек взломщик пароля, который является отличным способом проверить базу данных текущего пароля.

34
задан Undo 24 October 2015 в 17:41
поделиться

6 ответов

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

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

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

45
ответ дан 27 November 2019 в 16:15
поделиться

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

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

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

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

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

РЕДАКТИРОВАТЬ EOF: EOF обычно равен -1, но это не гарантируется стандартом. Стандарт определяет только EOF в разделе 7.19.1:

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

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

27
ответ дан 27 November 2019 в 16:15
поделиться

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

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

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

7
ответ дан 27 November 2019 в 16:15
поделиться

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

Редактировать:

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

4
ответ дан 27 November 2019 в 16:15
поделиться

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

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

вместо:

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

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


#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>
4
ответ дан 27 November 2019 в 16:15
поделиться
#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. Я думаю, это зависит от компилятора к компилятору.

1
ответ дан 27 November 2019 в 16:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: