将输入流设置为在循环中重复返回EOF



我写了这个:

#include<stdio.h>
int main(void)
{
int input=0;
while(input=getchar())               //TARGET
printf("%dn",input);
}

我有意使用不带!=EOF的循环。我在问按下ctrl+d后设置了什么位,因为它一直在打印-1,即使没有输入任何输入-这表明一定为使getchar((重复返回-1的流设置了一些错误位-我想知道这是什么;这整件事的背后是什么。

再加上如何将流重新设置为正常状态。

它是linux上的一个输入。

流的end-of-file标志在到达EOF时设置。这是feof()函数测试的标志。

如果你想阅读这篇文章,你可以使用clearerr()函数。这清除了错误和EOF指标(我认为没有办法只清除其中一个(。

int main(void)
{
int input=0;
while(input=getchar()) {              //TARGET
printf("%dn",input);
if (feof(stdin) || ferror(stdin)) {
clearerr(stdin);
}
}
}

请注意,在EOF之后,您是否真的可以读取任何内容都取决于系统和设备。如果stdin是一个终端或普通文件,则EOF是一个临时条件(用户可以在输入Ctl-d后继续在终端上键入,并且可以向文件中添加更多数据(。但是一旦到达TCP流的末尾,就无法向其中添加任何内容

我已经在多个环境中测试了您的代码片段的克隆。首先,Ctrl+D并不总是模拟EOF。在Windows中,它是Ctrl+Z。一种可靠的测试方法是使用重定向:

test.exe<sample.txt

如果没有这个,在"交互模式"中,你可以看到以下之间的区别:

a a a Ctrl+Z97 97 97 10(10是换行符(

Ctrl+Z-1

这并不是说"字符"是-1。相反,没有什么可读的。所以基本上是EOF。

现在,当您使用重定向加载文件时,while循环将永远不会停止,因为-1不为零。然而getchar((不断返回-1。

希望这能提供一些视角。

最新更新