freopenは、指定のストリームをいったん閉じて、新しいストリームを開いて、指定のファイルと紐づける。
C言語関数辞典 - freopen
freopen, freopen_s - cppreference.com
コンピューター:C言語講座:freopenについて
ファイル処理 | C++ プログラミング解説
/* ヘッダファイルのインクルード */ #include <stdio.h> /* 標準入出力 */ /* main関数 */ int main(void){ /* 変数の宣言 */ FILE *fp; /* ファイルポインタfp */ /* 存在しないファイルをわざと開く. */ fp = fopen("test.txt", "r"); /* fopenで"test.txt"を開く. */ if (fp == NULL){ /* NULLなら. */ /* エラーメッセージの出力. */ perror("fopen error!"); /* perrorで"fopen error!"と出力. */ /* 異常終了 */ return -1; /* -1を返して異常終了. */ } /* プログラムの終了 */ return 0; /* 0を返して正常終了. */ }
perrorは、stderrに出力しているので、
$ vi freopen.c $ gcc freopen.c -o freopen $ ./freopen fopen error!: No such file or directory $
このようにコンソール出力される。
これをerr.logにリダイレクトするには、
freopenでstderrをいったん閉じて、新たに開いてerr.logと紐づける。
$ vi freopen.c $ gcc freopen.c -o freopen $ ./freopen $ ls err.log freopen freopen.c $ cat err.log new = 658584000, stderr = 658584000 fopen error!: No such file or directory $
err.logにリダイレクトできた。
ちなみに、戻り値と指定したstderrは同じようだが、stderrだけど2じゃないのか・・・。
Sample/c/freopen/freopen/src/freopen at master · bg1bgst333/Sample · GitHub