2005年07月11日
川俣晶の縁側ソフトウェア技術雑記 total 4077 count

Borland C++ 5.5.1 for Win32において、パイプに対するfeof関数が機能しない問題

Written By: 川俣 晶連絡先

 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リターンとしてコンパイル後、コマンドプロンプトから以下のようなコマンドを入力します。(詳細は略)

dir|feof

 最後に以下のようなメッセージが表示された場合は、ferror関数が真を返しています。

ferror: Broken pipe

 なお、上記ソースコードを、Visuai Studio.NET 2003で、C++のWin32アプリケーションのプロジェクトでビルドして実行すると、この問題は発生しません。つまり、上記メッセージは表示されず、feof関数が真となります。