2

freopen-ingの後stdout、端末で印刷するにはどうすればよいですか?

freopen("out", "w", stdout); // reopen stdout
/* something */
printf("Now I want to print this on terminal");
4

2 に答える 2

8

これがあなたが探しているものだと思います:

freopen を使用したら、元の stdout (または stdin) を元に戻すにはどうすればよいですか?

移植可能なソリューションはありません。ただし、リンクには、独自のストリームを使用した可能なソリューションと、ほとんどの posix システムで動作する移植性のないソリューションも説明されています。

良い方法はありません。元に戻す必要がある場合の最善の解決策は、最初から freopen を使用しないことです。元の stdout (または stdin) をそのままにして、自由に再割り当てできる独自の明示的な出力 (または入力) ストリーム変数を使用してみてください。たとえば、グローバルを宣言します

FILE *ofp;

printf( ... ) へのすべての呼び出しを fprintf(ofp, ... ) に置き換えます。(もちろん、putchar と puts の呼び出しもチェックする必要があります。) 次に、ofp を stdout またはその他に設定できます。

freopen を完全にスキップして、次のようにできるかどうか疑問に思うかもしれません。

FILE *savestdout = stdout;
stdout = fopen(file, "w");    /* WRONG */

を行うことで、後で stdout を復元できるようになります

stdout = savestdout;      /* WRONG */

ただし、stdout (および stdin と stderr) は通常、再割り当てできない定数であるため、このようなコードは機能しない可能性があります (最初に freopen が存在するのはそのためです)。

元のストリームを後で復元できるように、 freopen を呼び出してその場所でファイルを開く前に、移植性のない方法でストリームに関する情報を保存しておくことができる場合があります。最も簡単で信頼できる方法は、利用可能な場合、dup や dup2 などのシステム固有の呼び出しを使用して、基になるファイル記述子を操作することです。もう 1 つは FILE 構造体の内容をコピーまたは検査することですが、これは非常に移植性が低く、信頼性が低くなります。

一部のシステムでは、(たとえば) 元の標準出力にまだ接続されている特別なデバイス ファイル (最新バージョンの Unix では /dev/fd/1 など) を再度開くことができる場合があります。一部のシステムでは、制御端末を明示的に再度開くことができますが、元の入力または出力 (つまり、freopen を呼び出す前の標準入力または標準出力) がコマンドライン。

于 2014-11-02T13:19:45.470 に答える
-4

次の方法で実行できます。

#include <fstream> 

ofstream out("out.txt");

out<<"something";

then

cout<<"something";
于 2014-11-02T13:16:47.463 に答える