私は次のようなことをしているWindowsC++プログラムを持っています:
FILE * pf = ...; * stdout = * pf; //stdoutはstdio.hで定義されています
stdoutファイルハンドルの値を変更するとどうなるかについての説明を探しています。これは、stdoutをリダイレクトするための単なる方法ですか?
-cr
私は次のようなことをしているWindowsC++プログラムを持っています:
FILE * pf = ...; * stdout = * pf; //stdoutはstdio.hで定義されています
stdoutファイルハンドルの値を変更するとどうなるかについての説明を探しています。これは、stdoutをリダイレクトするための単なる方法ですか?
-cr
はい、stdoutを変更すると、効果的に別の場所にリダイレクトされます。ただし、そのようにstdoutに直接割り当てることはできません。stdoutをリダイレクトする場合は、代わりにを使用する必要がありますfreopen()。
FILEオブジェクトを直接操作しないでください。不透明(OPAQUE)型として扱い、<stdio>ライブラリ内の関数を介してのみ操作する必要があります。ジョナサンはいくつかの正当な理由を挙げています。
C99標準、セクション7.19.3、パラグラフ6から:
ストリームの制御に使用されるFILEオブジェクトのアドレスは重要な場合があります。FILEオブジェクトのコピーは、元のオブジェクトの代わりに提供する必要はありません。
stdout指定されたツールを使用する代わりに割り当てによって変更する場合( freopen()Adam Rosenfield が言ったように、C で - ひいては C++ で)、あらゆる種類の責任を負うことになります。
coutリダイレクトされるかどうかも不明です。pfた場合、ダブルフリー エラー (クラッシュ) の責任を負います。きれいに仕事をする方がはるかに良いです。
(デモ コードは、必ずしもベンダーのコーディング チームの中で最も経験豊富な人々によって書かれたり、精査されたりするわけではありません。