首页 > 解决方案 > 管道和 getchar()

问题描述

关于 getchar() 从空文件传输时如何与标准输入交互的困惑。

这是简单的 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)传输到标准输入时会发生什么......

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

我想我会期望 test_program 阻塞,直到我实际提供数据。为什么它从文件 a 为空的 stdin 读取,为什么还要打印垃圾?

标签: cpipe

解决方案


这个片段很好地解释了它。

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

我想我会期望 test_program 阻塞,直到我实际提供数据。为什么它从文件 a 为空的 stdin 读取,为什么还要打印垃圾?

当您(尝试)从空流中读取数据时,您将获得 EOF。这就是你如何知道流是空的。


推荐阅读