私を襲ったパズル。いくつかの単純なテスト ハーネス コードで、標準出力にストリームする文字が多すぎると、プログラムが失敗します。奇妙ですが、非常に再現性があります。これは Windows のみの問題かもしれませんが、簡単に確認できます。
#include <iostream>
#include <deque>
using namespace std;
int main()
{
deque<char> d;
char c;
while (cin.get(c)) d.push_back(c);
for (deque<char>::reverse_iterator j = d.rbegin(); j != d.rend(); j++)
cout << (*j);
}
前のコードは、stdin から char のストリームをロードし、それらを逆の順序で出力するだけです。100K 程度の文字までは問題なく動作しますが、それより大きいファイルの場合、Windows で「stdout の書き込みエラー」メッセージが表示されて停止します。いつも同じキャラで死ぬ。問題を再現するために必要なのは、「cat bigfile.txt | reverse.exe」のようなシェル コマンドだけです。MSFT コンパイラと Intel コンパイラはどちらも同様に動作します。
stdout にバッファがある可能性があることは認識していますが、いっぱいになったときに自動的にフラッシュされるべきではありませんか?