Borland C++ 5.5.1 for Win32で標準Cライブラリを使用し、標準入力から入力するプログラムを作成した場合、パイプから入力させた場合のみ、入力の終わりがEOFではなく"Broken pipe"のエラーとして扱われるケースがあります。
つまり、パイプ入力の最後でfeof関数が真を返すことが期待されているにもかかわらず、ferror関数が真を返し、feof関数は偽を返します。
再現条件は、こちらの環境での結果ではありますが、Windows XP, Windows 2000 Workstationで再現することを確認しました。Windows 95, Windows 98SE, Windows MEでは正常にfeof関数が真になりました。
検証プログラム (feof.c) §
#include <stdio.h>
int main()
{
for(;;)
{
int ch = getchar();
if( feof(stdin) ) break;
if( ferror(stdin) )
{
perror("ferror");
break;
}
putchar(ch);
}
return 0;
}
検証実行 §
上記ソースをbcc32 feof.cリターンとしてコンパイル後、コマンドプロンプトから以下のようなコマンドを入力します。(詳細は略)
最後に以下のようなメッセージが表示された場合は、ferror関数が真を返しています。
なお、上記ソースコードを、Visuai Studio.NET 2003で、C++のWin32アプリケーションのプロジェクトでビルドして実行すると、この問題は発生しません。つまり、上記メッセージは表示されず、feof関数が真となります。