Что такое EOF и как его запускать? [закрыто]

Это мой исходный код C.

Когда я его создаю в Ubuntu, он начинает получать символы, но я не знаю, как закончить программу, так как она не заканчивается вводом ENTER или возврат каретки.

Что означает EOF? Как я могу его вызвать?

Этот источник также находится в книге Денниса Ричи:

#include <stdio.h>
    /* count digits, white space, others */
main ()
{
  int c, i, nwhite, nother;
  int ndigit[10];
  nwhite = nother = 0;
  for (i = 0; i < 10; ++i)
    ndigit[i] = 0;
  while ((c = getchar ()) != EOF)
    if (c >= '0' && c <= '9')
      ++ndigit[c - '0'];
    else if (c == ' ' || c == '\n' || c == '\t')
      ++nwhite;
    else
      ++nother;
  printf ("digits =");
  for (i = 0; i < 10; ++i)
    printf (" %d", ndigit[i]);
  printf (", white space = %d, other = %d\n", nwhite, nother);
}
1
задан 25 January 2016 в 06:19

2 ответа

ТЛ;др: ВФ-это не персонаж, это макрос, используемый для оценки негативных возврата функции ввода-значение. Можно использовать сочетание клавиш Ctrl+D, чтобы отправить [ф14] характер, который будет заставлять возвращать функция [ф15]

TL;д-р

обратимся к "с Справочное руководство", на Харбисона и Стила, 4-е изд. с 1995, стр. 317:

отрицательное целое число eof имеет значение, это не кодирование "реальный персонаж" . . . Например fget (раздел 15.6) возвращает eof, когда в конец файла, потому что нет "реального персонажа" для чтения.

по существу [ф16] не символ, а целое значение, реализованный в [f17 в] представлять [ф18]. Таким образом, ответить на кос является правильным насколько это идет, но это не о получении "пустых" вход. Важно отметить, что здесь ВФ служит возвращаемое значение (по [зг19]) сравнения , не означает фактического характера. В [ф20] поддерживает эту:

отрицательное целое число eof имеет значение, это не кодирование "реальный персонаж" . . . Например fget (раздел 15.6) возвращает eof, когда в конец файла, потому что нет "реального персонажа" для чтения.

то fgetc(), еокп() и getchar() возвращает символ читается как беззнаковый Тип char приводится к int или eof на конец файла или ошибка. получает() и помощью fgets() обратный С В случае успеха и NULL в случае ошибки или конца файла, когда происходит при отсутствии символы были прочитаны. функции ungetc() возвращает c на успех, или eof в случае ошибки.

ВОЗВРАЩАЕМОЕ значение

[Ф1]

рассмотреть [клавиши f21] петля - его основной целью является повторение действий возвращаемое значение. Посмотри еще раз:

он как бы говорит продолжать делать вещи, если [ф22] возвращает успешный код ([ф23] или выше ; это обычное дело кстати, попробуйте запустить успешную команду, то [ф24] и не [f25 привод датчика] и вижу цифры, они возвращаются ). Так что если мы удачно сделать персонажа и ассинг с , возвращается код состояния 0, не равен -1. [ф26] определяется как -1. Поэтому, когда состояние [ф28] возникает, петель останавливается. И когда это произойдет ? Когда нет больше характера к вам, когда c = getchar() терпит неудачу. Вы могли бы написать [f30 С] и она все равно будет работать

[Ф2]

кроме того, давайте вернемся к фактический код, вот выдержка из [ф31]

целое число

хотя символ eof-это не реальный персонаж, однако, существует [f32 из] (конец передачи) персонажа, который имеет десятичный код ASCII значение 04; она связана с клавиши Ctrl ярлык+д ( представлены также и Мета-характер ^D). В конце герой передачи, используемый для обозначения закрытия потока данных назад, когда компьютеры были использованы для контроля телефонных соединений и , следовательно, "конец передачи" именования.

[Ф3]

так можно отправить, что ASCII-код в программу, как так, обратите внимание на $'\04', которая СРВ:

таким образом , мы можем сказать, что оно существует, но это не для печати

Примечание

мы часто забываем, что в прошлом компьютеры были не столь универсальны - дизайнеров, чтобы использовать каждую клавишу клавиатуры. Так , отправив [ф35] персонаж с CtrlD еще "передача персонажа" , не вписав в отличие от столицы, помощи shifta, чтобы дать компьютеру вход с имеющимися ключами. Таким образом, СРВ-настоящий характер в том смысле, что оно придет от пользователей, он доступен для чтения на компьютере (хотя и не для печати, не видимые человеком), она существует в памяти компьютера

то fgetc(), еокп() и getchar() возвращает символ читается как беззнаковый Тип char приводится к int или eof на конец файла или ошибка.

Примечание

если вы пытаетесь читать из /dev/NULL, что необходимо также вернуть ВФ, верно? Или что я получу там?

[Ф4]

да, совершенно верно, потому что в [f36 в] Нет фактический характер для чтения , поэтому [фунции f37] возвращает код -1, и программа завершит свою работу сразу. Снова команда не возвращают eof. ВФ-это просто постоянная переменная, равная -1 , которые мы используем для сравнения код возврата функции getchar. [ф39] не существует, как персонажа, это просто статическое значение внутри [ф40].

демо:

[ф5]

еще один гвоздь в гроб

[dрайвер d41]иногда он пытался доказать, что ВФ-это персонаж с такой код:[!dрайвер d41] [ф6]

проблема в том, что Тип char может быть знаковым или беззнаковым значением. Кроме того, они являются наименьшая адресуемая тип данных, что делает их очень полезными в микроконтроллерах, где память ограничена. Поэтому вместо объявления [ф41] это часто можно увидеть в микроконтроллерах с малым память char foo = 25; или что-то подобное. Кроме того , символы могут быть знаковыми или беззнаковыми.

можно убедиться, что размер в байтах с программой такой:

[ф7]

какой смысл ? Дело в том, что ВФ определяется как -1, но тип данных char может печатать целые значения.

skolodya@убунту:$ ВФ ССЗ.с-о ВФ ВФ.C: в функции "main": ВФ.с:4:5: предупреждение: Формат ‘%S’ не ожидает аргумент типа ‘char * ’ и, возвращает eof [-Wformat=] функции printf("%ы", ВФ);

ОК . . .так что если мы попытаемся напечатать char как строку ?

явная ошибка, но тем не менее,ошибкой будет рассказать что-нибудь интересное:[!команда d48] [ф8]

не возвращают eof. ВФ-это как раз постоянная переменная, равная -1 , которые мы используем для сравнения код возврата функции getchar

[F9] и

печать ВФ в виде шестнадцатеричного значения дает FFFFFFFF, а 16 бит (8 байт) значение, два комплиментом [пулемет f44].

[ф10]

выход:

[ф11] [размером d57]еще одна любопытная вещь происходит с помощью следующего кода:[!размером d57]

если нажать д + д , мы получаем шестнадцатеричное значение 41 , очевидно же, что в таблице ASCII. Но для Ctrl + D , мы имеем [f45 с] , опять - возвращаемое значение getchar(), хранящиеся в c.

[ф12] [d63, как][и D40]еще один гвоздь в гроб[!и D40][!d63, как] [от f13]
3
ответ дан 23 May 2018 в 14:04
  • 1
    Отличный момент, действительно, персонаж каким-то образом отправляется. – kos 25 January 2016 в 04:56
  • 2
    Я думаю, что характер EOF - это то, что было потеряно в переводе, поскольку оно не является фактическим персонажем, но EOT является фактическим, ascii персонажем. Иди цифра! – Sergiy Kolodyazhnyy 25 January 2016 в 06:02
  • 3
    Если вы попытаетесь прочитать из /dev/null, это должно также вернуть EOF, правильно? Или что я туда доберусь? – Byte Commander 25 January 2016 в 12:14
  • 4
    @ByteCommander позволяет узнать. Do cat / dev / null | cat -A. – Sergiy Kolodyazhnyy 25 January 2016 в 12:41
  • 5
    @ByteCommander добавил раздел, посвященный вашему комментарию – Sergiy Kolodyazhnyy 25 January 2016 в 12:49

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

echo "Some sample text" | ./a.out

, где a.out - ваш скомпилированный источник

2
ответ дан 23 May 2018 в 14:04
  • 1
    Это уже подтвердилось, однако на стороне примечание EOF не является символом, я думаю, что неправильное представление возникает из-за того, что сигнализируется нажатием клавиши CTRL, что обычно является способом ввода непечатаемых символов. Насколько я понимаю, все, что на самом деле происходит, - это то, что все входные данные сброшены и вход для сброса пуст read() (syscall) вернет 0, который интерпретируется как EOF: stackoverflow.com/a/1516177/ 4316166 – kos 24 January 2016 в 16:48
  • 2
    @kos, ты прав, это сигнал после всего. – Paulius Šukys 24 January 2016 в 16:57

Другие вопросы по тегам:

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