問題は 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