Труба и getchar () - PullRequest
       5

Труба и getchar ()

0 голосов
/ 25 октября 2019

Путаница с тем, как getchar () взаимодействует с stdin при передаче по каналу из пустого файла.

Вот простой код c test_program.c

#include <stdio.h>
int main( ) {

   int c;

   printf( "Enter a value :");
   c = getchar( );

   printf( "\nYou entered: ");
   putchar( c );
   printf( "\n");

   printf( "Enter a value :");
   c = getchar( );

   printf( "\nYou entered: ");
   putchar( c );
   printf( "\n");

   return 0;
}

Любопытно, что произойдет, когда я отправлю трубкупустой файл (a) в stdin ...

$ cat a | ./test_program
Enter a value :
You entered: �
Enter a value :
You entered: �

Полагаю, я ожидал, что test_program будет блокироваться до тех пор, пока я фактически не передам ему данные. Почему он читает из стандартного ввода, где файл a пуст и почему он также печатает мусор?

1 Ответ

0 голосов
/ 25 октября 2019

Этот фрагмент объясняет это довольно хорошо.

#include <stdio.h>
int main(void) 
{
    int c = getchar( );
    if(c == EOF) 
        printf("EOF\n");
}

Полагаю, я ожидал, что test_program будет блокироваться до тех пор, пока я на самом деле не передам данные. Почему он читает из стандартного ввода, где файл a пуст и почему он также печатает мусор?

Когда вы (пытаетесь) прочитать данные из пустого потока, вы получите EOF. Вот откуда ты знаешь, что поток пуст.

...