freopen関数は、オープン済みのファイルを閉じて、別のファイルをオープンします。主に、標準テキスト・ストリーム(stderr、stdin、stdout)と対応付けられているファイルを変更するために使用します。

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

*pathはオープンするファイルのパス名を文字列で指定します。
*modeは入出力の区分(モード)を文字列で指定します。
*streamは既に作成済みのファイルポインタを指定します。第1引数で指定したファイルのファイルポインタに内容を変更します。

第2引数の*modeに付いてはopen関数を参照してください。

戻り値として、正常にオープンできた場合は、FILE 型のポインタ(ファイルポインタ)を返し、エラーの場合は、NULL値を返します。

次の例題プログラムは標準出力(stdout)をtemp_1.txtファイルに切り替えています。

プログラム 例

#include <stdio.h>
#define BUFF_SIZE 1024

int main()
{
  FILE    *fp;
  char    buff[BUFF_SIZE];
  int     return_code = 0;

  /* 標準出力をtemp_1.txtファイルに切り替える */
  if ((fp = freopen('temp_1.txt', 'w', stdout)) != NULL) {
    /* 標準入力から1行入力 */
    while (fgets(buff, BUFF_SIZE, stdin) != NULL) {
      printf('%s', buff);
    }

    fclose(fp);
  }
  else {
    printf('ファイルの再オープンに失敗しました\n');
    return_code = 1;
  }

  return return_code;
}

例の実行結果

$ ./freopen.exe
Hello World!!.
Bye.
$
$ cat temp_1.txt
Hello World!!.
Bye.
$