Windows控制台下的Stdin和EOF行为

时间:2017-01-21 16:49:40

标签: c windows stdin eof

我正在学习输入如何在C中工作。我最大的奋斗是理解终端中的EOF行为 首先,我正在使用Windows和GCC编译器“如果这可能有帮助” 其次,我不是试图重定向文件中的输入...我的问题是关于来自Windows控制台的输入

我的问题:

我读到EOF关闭了输入流,你在EOF之后无法从stdin读取......对我来说情况并非如此!即使在我明确输入Enter-Ctrl-Z-Enter后,如果我执行另一个getchar()调用,它也会从stdin中读取...例如:

int c = 0;
char str[100]={0};

printf("Type in a string with spaces so some chars would remain in Stdin: ");
//Let's say i type "Hello world!"
scanf("%s",str);

while( (c=getchar()) != EOF )
    printf("%c",c);
//it displays " World!" in console, then i type Enter-^Z-Enter
//The loop exits so far so good

printf("Let's just check if we can still read from stdin, type a char: ");
c = getchar(); //i type the letter 'a'
printf("\nYou entered: %c\n",c); //It displays 'a'?!

另外,当你在字符串中间键入^ Z时会发生一些奇怪的事情,在它之前的任何字符都会被返回但是在它之后输入的任何字符都会被拒绝!但是当你检查变量内容时,它不等于-1?这是一个例子:

int c = 0;
char str[100]={0};

printf("Type in a string with spaces so some chars would remain in Stdin: ");
//This time i type "Hello wor^Zld!" with ^Z in the middle of "World!"
scanf("%s",str);    

while( (c=getchar()) != EOF )
    printf("%c",c);
//it displays " Wor->" in console, with the cursor hanging waiting for input
/*
So on the one hand, after ^Z everything disappears, but on the other 
hand it's waiting for input so it's not EOF?!
*/

//In case you're wondering, here too i can call getchar() and read from stdin!
printf("Let's just check if we can still read from stdin, type a char: ");
c = getchar(); //i type the letter 'a'
printf("\nYou entered: %c\n",c); //It also displays 'a'?!


相信我,我真的很想了解它是如何工作的,但对于C语言的初学者来说真的很困惑......所以任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:1)

让我解释一下:这个函数的经典用法是从文件中读取。每个文件以EOF结尾。 stdin是“特殊文件”,因为它没有EOF。它是如何工作的?每次按Enter键时,您键入的字符串都会插入到stdin缓冲区中。每次调用getchar()都会从此缓冲区中读取单个char。当您调用getchar()并且缓冲区为空时,程序会等待用户键入新字符串,然后按Enter键。 那么,当我们从stdin获得EOF时?基本上,永远不会。但是用户可以通过类型 Ctrl + Z 来模拟EOF。这将进入EOF char,但它对什么都没有影响!在这种情况下,它只是一个字符。

答案 1 :(得分:1)

使用Ctrl-Z发出EOF信号。您的程序会相应地运行。但斯坦丁仍然会保持开放。你仍然可以关闭' stdin,但仅适用于您的程序。试试这个,看看差异:

   while ((c = getchar()) != EOF)
      printf("%c", c);
   fclose(stdin); // <----------
   printf("Let's just check if we can still read from stdin, type a char: ");
   c = getchar();
   printf("\nYou entered: %c\n", c);

你不会得到一个&#39;再过,你会得到EOF(-1)。


修改

  • EOF是stdio.h中的宏定义,通常等于-1
  • 要通过终端输入模拟EOF,请在Windows控制台中键入序列:Enter-Cntrl-Z-Enter。
  • 在EOF信号之后,输入流保持打开...为什么?因为stdin应该始终是开放的。 (可以使用fclose(stdin)来关闭流,但这是一个坏主意,因为文件句柄很容易搞砸。)
  • ^ Z不是EOF,如果你检查它的值是26(不是-1)。
  • 在任何地方键入^ Z会在之后刷新stdin ......