0

问题仅与 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
4

0 回答 0