0

問題は Windows のみに関連しています。Visual Studio 2012 コンパイラ (vc11) を使用しています。

入力ファイル(標準入力としてリダイレクトされる)から数行(1文字ずつ)を読みたいと思います。しかし、各行を読んだ後、標準入力をフラッシュしたいと思います。

詳細に説明しましょう: setvbuf 関数で標準入力のバッファリングをオフにします (この標準入力がないとバッファリングされ、最初のフラッシュで入力全体がクリアされます)。次に、プログラムは入力ファイルから数行を読み取ります。1文字ずつ読み込みます(fgetc関数)。各行の後、標準入力を fflush でクリアします。Windows では、入力ストリームの fflush が定義されています。MSDN によると、「ストリームが入力用に開かれている場合、fflush はバッファの内容をクリアします。」https://msdn.microsoft.com/en-us/library/aa272686(v=vs.60).aspx

しかし、私はそれがどのように機能するのか理解していません。(行の) 最初の文字が入力から読み取られないことがあります。おそらく fflush が原因です (おそらく fflush は stdin バッファからこの最初の文字をクリアしますか?)。しかし、それは数行でしか発生しません (一部の行は最初の文字で読み取られます)。

この最初の文字が (ときどき) 消えてしまうのはなぜですか?

どうすればこれを修正できますか? (各行を読んだ後に 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