как использовать EOF STDIN в C - PullRequest
5 голосов
/ 11 ноября 2011

Мне нужно вводить координаты в массив, пока не встретится EOF, но что-то не так в моем коде. Я использовал Ctrl + Z, Ctrl + D

int main()
{
    int x[1000],y[1000];
    int n=0,nr=0,a,b,i;
    printf("Enter the coordinates:\n");
    while(scanf ( "%d %d ", &a, &b) == 2)
    {
     x[n]=a;
     y[n]=b;
     n++;
    }
    if (!feof(stdin))
    {
       printf("Wrong\n");
    }
    else
    {
       for(i=0;i<n;i++)
       printf("%d %d\n", x[i], y[i]);
    }

  return 0;
}

Ответы [ 2 ]

16 голосов
/ 11 ноября 2011

Я предлагаю использовать

while(!feof(stdin) && scanf ( "%d %d ", &a, &b) == 2)

и на самом деле лучше протестировать feof после (не раньше!) Некоторой операции ввода, поэтому:

while (scanf("%d %d ", &a, &b) == 2 && !feof(stdin))

Кстати, во многих системах stdin является строкой с буферизацией, по крайней мере, с интерактивными терминалами (но, возможно, не тогда, когда stdin является pipe (7) ) см. setvbuf (3)

В Linux и POSIX вы можете рассмотреть чтение каждой строки с getline (3) (или даже с readline (3) при чтении из терминала, поскольку readline предлагает редактирование способности), а затем анализ этой строки, например, sscanf (3) (возможно, также с использованием %n) или strtol (3)

3 голосов
/ 08 мая 2012

Единственная реальная проблема, которую я вижу в вашем коде, это лишние пробелы в строке формата scanf. Эти пробелы говорят scanf использовать символ пробела на входе, что заставляет scanf не возвращаться к вашему коду, пока он не достигнет непробельного символа (такого как буква, число, пунктуация или EOF).

В результате после ввода двух чисел, а затем Введите , вам необходимо набрать Ctrl - D ( Ctrl - Z в DOS / Windows) дважды , прежде чем ваша программа выйдет из цикла while.

...