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 否则,在“交互模式”中,您可以看到以下内容之间的差异:

按Ctrl+Z组合键 97 10(10是换行符)

Ctrl+Z -一,

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

现在,当您加载带有重定向的文件时,while循环将永远不会停止,因为-1不是零。但是getchar()始终返回-1


希望这能提供一些视角。

流的
文件结束标志在到达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);
        }
    }
}