C 设置输入流以在循环中重复返回EOF
我写过这样的话:C 设置输入流以在循环中重复返回EOF,c,C,我写过这样的话: #include<stdio.h> int main(void) { int input=0; while(input=getchar()) //TARGET printf("%d\n",input); } #包括 内部主(空) { int输入=0; while(input=getchar())//目标 printf(“%d\n”,输入); } 我故意在没有的情况下使用了loop=EOF。我问的是,
#include<stdio.h>
int main(void)
{
int input=0;
while(input=getchar()) //TARGET
printf("%d\n",input);
}
#包括
内部主(空)
{
int输入=0;
while(input=getchar())//目标
printf(“%d\n”,输入);
}
我故意在没有的情况下使用了loop=EOF
。我问的是,在反复按下ctrl+d后设置了什么位,因为它一直在打印-1,即使没有输入任何输入-这表示一定为正在进行getchar()返回-1的流设置了一些错误位-我想知道这是什么这整件事的背后是什么
以及如何将流重新设置为正常状态
这是linux上的一个输入。我已经在多个环境中测试了您代码片段的克隆。首先,Ctrl+D并不总是模拟EOF。在Windows中,它是Ctrl+Z。可靠的测试方法是使用重定向: test.exe
希望这能提供一些视角。流的
文件结束标志在到达EOF时设置。这是函数测试的标志
如果你想阅读过去这一点,你可以使用函数。这将清除错误和EOF指示器(我认为没有办法只清除其中一个)
请注意,在EOF之后,您是否真正可以读取任何内容取决于系统和设备。如果stdin
是终端或普通文件,则EOF是一个临时条件(用户可以在输入Ctl-d后继续在终端上键入,并且可以向文件中添加更多数据)。但是,一旦到达TCP流的末尾,就无法向其添加任何内容。我不理解这个问题。您已经指示了流的结束,并且有一个循环不断地告诉您这一点。也许你的意思是使用while((input=getchar())!=EOF)
@WeatherVane我已经编辑了代码后的部分。getchar()在无法读取任何内容时返回EOF。EOD在您的系统上定义为-1。显然,你应该检查EOF。建议不要在循环中使用eof()函数,因为它只在读取失败后返回true。但是当你阅读时,你需要检查EOF。这个问题有什么问题吗?我不知道为什么它被否决了。在你编辑以澄清你的意思之前,它可能被否决了。不是我,尽管我的负面评论。有些事情对我来说真的很糟糕,我投了反对票,而这一次表现得很好。我的意思是我看不出你有什么问题。@AgrudgeAmicus这是因为Barmar所说的原因——现在删除它并进行投票。细节:如果你在乎的话。EOF
之后的讨论与由于“文件结束”而导致的EOF
有关<由于罕见的输入错误(例如奇偶校验错误)而导致的代码>EOF
是另一回事,因为输入错误的原因可能是暂时的,并且clearr()
将很容易清除错误标志,并且下一次输入是正常的。o输入错误(例如,文件在写入模式下打开)将是永久性的。一个clear()
将被清除,但下一个输入将出错并返回EOF
。
int main(void)
{
int input=0;
while(input=getchar()) { //TARGET
printf("%d\n",input);
if (feof(stdin) || ferror(stdin)) {
clearerr(stdin);
}
}
}