freopen() — オープンファイルを宛先変更する

形式

#include <stdio.h>
FILE *freopen(const char *filename, const char *mode, FILE *stream);

言語レベル

ANSI

スレッド・セーフ

はい

説明

freopen() 関数は、現在 stream に関連付けられているファイルをクローズし、 streamfilenameで指定されたファイルに再割り当てします。 freopen() 関数は、指定された modeを持つ stream に関連付けられた新規ファイルをオープンします。これは、ファイルに対して要求されたアクセスのタイプを指定する文字ストリングです。 freopen() 関数を使用して、標準ストリーム・ファイル stdinstdout、および stderr を、指定したファイルにリダイレクトすることもできます。

データベース・ファイルの場合、 filename が空ストリングであれば、 freopen() 関数は、ストリームを新しいファイルまたは装置に再割り当てするのではなく、クローズして新しいオープン・モードに再オープンします。 ファイル名を指定せずに freopen() 関数を使用すると、ストリームをリダイレクトすることなく、標準ストリームのモードをテキストからバイナリーに変更できます。以下に例を示します。

   fp = freopen("", "rb", stdin);

同じメソッドを使用してモードをバイナリーからテキストへ戻すこともできます。

filename を指定した freopen() 関数を、SYSIFCOPT (*IFSIO) で作成されたモジュール内の空ストリングとして使用することはできません。

戻り値

freopen() 関数は、新しくオープンされたストリームへのポインターを戻します。 エラーが発生すると、 freopen() 関数は元のファイルをクローズし、 NULL ポインター値を戻します。

errno の値は、次のいずれかに設定されます。
意味
EBADF
ファイル・ポインター、または記述子が有効ではありません。
EBADMODE
指定されたファイル・モードが無効です。
EBADNAME
指定されたファイル名が無効です。
ENOENT
ファイルまたはライブラリーがありません。
ENOTOPEN
ファイルはオープンされていません。
EIOERROR
回復不能入出力エラーが起こりました。
EIORECERR
回復可能入出力エラーが起こりました。

次の例では stream1 データ・ストリームをクローズし、そのストリーム・ポインターを再割り当てします。 stream1 および stream2 は同じ値を持ちますが、必ずしも stream と同じ値ではありません。
#include <stdio.h>
#define  MAX_LEN  100
 
int main(void)
{
   FILE *stream, *stream1, *stream2;
   char line[MAX_LEN], *result;
   int  i;
 
   stream = fopen("mylib/myfile","r");
   if ((result = fgets(line,MAX_LEN,stream)) != NULL)
       printf("The string is %s\n", result);
 
   /* Change all spaces in the line to '*'. */
   for (i=0; i<=sizeof(line); i++)
     if (line[i] == ' ')
         line[i] = '*';
 
   stream1 = stream;
   stream2 = freopen("", "w+", stream1);
   fputs( line, stream2 );
   fclose( stream2);
}

関連情報