次のプログラムは有効な C プログラムですか?
#include <stdio.h>
int main()
{
fwrite("x", 1, 1, stderr);
fflush(stderr);
fgetc(stderr);
fwrite("y", 1, 1, stderr);
return 0;
}
stderr から読み取ろうとしていることに注意してください。
Visual C++ 2008 でコンパイルして実行すると、次の出力が得られます。
xy
これは理にかなっています。ただし、stderr をファイル ( test.exe 2> foo.txt
) にリダイレクトすると、「デバッグ アサーションに失敗しました」というメッセージが表示され、「ストリーム カウントに一貫性がありません。連続した読み取りと書き込みの間でフラッシュします」というメッセージが表示されます。読み取りと書き込みの間に a を追加するfflush
と、問題が解決します。(これはデバッグ ビルドで発生します。リリース ビルドでは、2 番目の書き込みはサイレントに失敗します)。
この動作は正しいですか、それともコンパイラライブラリのバグですか? Cで読み取りまたは書き込みがいつ違法であるかを説明するルールはどこにも見つかりませんでした。