问题仅与 Windows 有关。我正在使用 Visual Studio 2012 编译器 (vc11)。
我想从输入文件(重定向为标准输入)中读取几行(逐个字符)。但是在阅读每一行之后,我想fflush stdin。
让我详细解释一下:我通过 setvbuf 函数关闭了标准输入缓冲(没有这个标准输入将被缓冲并且首先刷新清除整个输入)。然后程序从输入文件中读取几行。字符被一一读取(fgetc 函数)。在每一行之后,我用 fflush 清除标准输入。在 Windows 上定义了输入流上的 fflush。根据 MSDN:“如果流打开输入,fflush 清除缓冲区的内容。” https://msdn.microsoft.com/en-us/library/aa272686(v=vs.60).aspx
但我不明白它是如何工作的。您可以看到有时第一个字符(行)不是从输入中读取的。可能是由于 fflush (也许 fflush 从标准输入缓冲区中清除了第一个字符?)。但它只发生在几行(有些行是用第一个字符读取的)。
为什么这个第一个字符会消失(有时)?
我该如何纠正?(假设我想在阅读每一行后调用 fflush(stdin) )。
程序:
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
setvbuf(stdin, 0, _IONBF, 0);
std::string text[6];
for(int i = 0; i < 6; i++)
{
int input;
char cc;
do
{
input = fgetc(stdin);
cc = (char)input;
if (cc != '\n' && input != EOF)
{
text[i] += cc;
}
}
while (cc != '\n' && input != EOF);
fflush (stdin);
}
for(int i = 0; i < 6; i++)
{
std::cout <<text[i] << std::endl;
}
return 0;
}
输入文件:
first
second
third
fourth
fifth
sixth
执行命令:
.\main.exe < input
输出(请注意缺少几行中的第一个字符):
first
econd
hird
fourth
fifth
ixth