2

この質問を自問せずに、以前は freopen (stdio.h から) 関数を使用していました。しかし今、私は確信が持てません。

たとえば、stdout を再度開いた場合:

    #define  OUTPUT_FILE "out.txt"
    if ( freopen(OUTPUT_FILE,"w+",stdout) == NULL)
      printf("logout can't be opened\n");

通常、すべてのプロセスは、stdout、stderr、stdin を自動的に処理します。これらを閉じる必要はありません。
しかし、ここにいるのはどうですか?stdout を再開しました。
再オープンされた stdout を閉じるために fclose を呼び出す必要がありますか?

PS ここですべてがうまくいっていると確信できると聞くよりも、この処理を行うコードの一部を見てうれしいです。

ヒントをお寄せいただきありがとうございます。

4

1 に答える 1

4

fclose(stdout);リダイレクトを閉じます。

通常、ファイルハンドルを閉じる方がクリーンです。プログラムの終了時にファイルポインタが開いている場合は、閉じられます。

ただし、ポインターを閉じるだけでは、stdout は端末に再度リダイレクトされません。

freopen("re.txt", "w", stdout);
printf("this is redirected stdout");
fclose(stdout); 

printf("this not");

次のコマンドを使用して、stdout を端末に再度復元できます (コマンドラインからのリダイレクトを解除できます)。

freopen("/dev/tty", "a", stdout);

freopen ( http://c-faq.com/stdio/undofreopen.htmldup ) を元に戻したい場合は、 () を使用して以前のポインターを復元するか、freopen をまったく使用しないでください。

于 2013-02-11T19:50:02.973 に答える