3

私は次のようなことをしているWindowsC++プログラムを持っています:

  FILE * pf = ...;
  * stdout = * pf; //stdoutはstdio.hで定義されています

stdoutファイルハンドルの値を変更するとどうなるかについての説明を探しています。これは、stdoutをリダイレクトするための単なる方法ですか?

-cr

4

2 に答える 2

6

はい、stdoutを変更すると、効果的に別の場所にリダイレクトされます。ただし、そのようにstdoutに直接割り当てることはできません。stdoutをリダイレクトする場合は、代わりにを使用する必要がありますfreopen()

FILEオブジェクトを直接操作しないでください。不透明(OPAQUE)型として扱い、<stdio>ライブラリ内の関数を介してのみ操作する必要があります。ジョナサンはいくつかの正当な理由を挙げています。

C99標準、セクション7.19.3、パラグラフ6から:

ストリームの制御に使用されるFILEオブジェクトのアドレスは重要な場合があります。FILEオブジェクトのコピーは、元のオブジェクトの代わりに提供する必要はありません。

于 2008-12-17T21:49:41.183 に答える
4

stdout指定されたツールを使用する代わりに割り当てによって変更する場合( freopen()Adam Rosenfield が言ったように、C で - ひいては C++ で)、あらゆる種類の責任を負うことになります。

  • coutリダイレクトされるかどうかも不明です。
  • ファイル記述子がリークする可能性があります (問題にならない場合があります)。
  • 元の stdout を適切にフラッシュしない可能性があります - 情報が失われます。
  • 元のファイル ポインタに関連付けられたメモリ リークが発生する可能性があります (これも問題ではありません)。
  • 何かが閉じpfた場合、ダブルフリー エラー (クラッシュ) の責任を負います。

きれいに仕事をする方がはるかに良いです。

(デモ コードは、必ずしもベンダーのコーディング チームの中で最も経験豊富な人々によって書かれたり、精査されたりするわけではありません。

于 2008-12-17T21:56:19.703 に答える