Язык C: Как узнать, когда нет ввода от stdin при перенаправлении ввода из файла - PullRequest
0 голосов
/ 07 июня 2018

Моя программа должна работать следующим образом:

CProgram

file.txt может содержать столько строк данных, сколько необходимо.Например,

2 3 G 5 6
5 6 7 
6 9 3 6 H
<<Blank line>>

Есть ли способ узнать, что больше нет входных строк?Каждый файл имеет пустую строку в конце.

Я могу читать строки, но моя программа никогда не узнает, что больше нет данных для чтения, и продолжает ждать больше данных, как это обычно ожидается от stdin.

Этокак я это читаю

 while( fgets(line, sizeof(line), stdin) != NULL) {
   ... do something
}

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Все функции ввода сообщат вам об окончании файла, когда файл будет завершен.Например:

#include <stdio.h>

int main(void) {
    int count = 0;
    while (getchar() != EOF)
        ++count;
    printf("There were %d characters.\n", count);
    return 0;
}

будет подсчитывать символы во входном потоке:

pax> ./testprog <testprog.c
There were 169 characters.

pax> echo -n hello | ./testprog
There were 5 characters.

Если вы используете fgets (как видно из вашего обновления),это также позволяет легко обнаруживать:

#include <stdio.h>

static char buff[1000];

int main(void) {
    int count = 0;
    while (fgets(buff, sizeof(buff), stdin) != NULL)
        ++count;
    printf("There were %d lines.\n", count);
    return 0;
}

Запуск, который будет подсчитывать строки:

pax> ./testprog <testprog.c
There were 12 lines.

В обоих случаях вы видите конецфайл обнаружен правильно с использованием методов перенаправления ввода или канала.Если вы выполняете чтение кода из терминала, вам просто нужно указать конец файла, используя средства, предоставляемые вашей средой.

Обычно это CTRL-D в начале строкив UNIX-подобных операционных системах или CTRL-Z в начале строки для Windows:

pax> ./testprog
this has
two lines
<Ctrl-D pressed (I run Linux)>
There were 2 lines.
0 голосов
/ 07 июня 2018

Поскольку вы читаете из stdin и используете fgets(), чтобы завершить цикл или нет больше строк, которые нужно взять у пользователя, проверьте возвращаемое значение fgets(), как показано ниже.

char *ptr = NULL;
while( (ptr= fgets(line, sizeof(line), stdin)) != NULL) {
    if( *ptr == '\n')
        break;
    else { /* do something */  }
}

Наконец, когда вы нажмете клавишу ВВОД if условие будет выполнено и прекратится.

0 голосов
/ 07 июня 2018

EOF представляет конец файла, поэтому вы можете читать файл, пока не нажмете EOF

int c = 0;
while ((c = getchar ()) != EOF) { ... }

РЕДАКТИРОВАТЬ:

while ( fgets(line, sizeof(line), stdin) != NULL ) {
    ... do something
}

должно работать нормально, так как fgets()возвращает NULL, если оно достигает конца файла.По крайней мере, в Unix, таких как ОС (Unix / Linux / BSD / Mac OS) все является файлом, поэтому это стандартный ввод.Таким образом, вы можете проверить EOF на стандартном вводе.

...