1. ホーム
  2. c

Cからのstdinとstdoutの再ルーティング

2023-10-08 06:20:06

質問

を再度開きたいのですが stdinstdout (そしておそらく stderr を呼び出すことができるように、ファイルハンドルを作成しました。 printf() または putchar() または puts() を呼び出すとファイルに移動し、今後 getc() などの呼び出しはファイルから行われます。

1) 標準入力/出力/エラーを永久に失いたくありません。私はプログラムの中で後でそれらを再利用したいかもしれません。

2) 新しいファイルハンドルを開きたくない。なぜなら、これらのファイルハンドルはたくさん渡されるか、グローバルでなければならないからです (震え声)。

3) 私はどんな open() または fork() などのシステム依存の機能は、どうしようもないとして。

で、基本的に、これをやるとうまくいくのか。

stdin = fopen("newin", "r");

また、もしそうなら、どうすれば元の値の stdin の元の値を取り戻すことができるでしょうか?それを FILE * に格納し、後でそれを取得する必要がありますか?

どのように解決するのですか?

なぜ freopen() ? C89 仕様では、以下のセクションの注釈の 1 つにその答えが記載されています。 <stdio.h> :

116. の主な用途は freopen 関数は、標準的な テキストストリーム ( stderr , stdin または stdout など)、これらの識別子は が返す値が変更可能な値である必要はありません。 が返す値。 fopen 関数 が割り当てられることがあります。

freopen は一般的に誤用されており、例えば stdin = freopen("newin", "r", stdin); . これは fclose(stdin); stdin = fopen("newin", "r"); . どちらの表現も stdin に割り当てようとするもので、割り当て可能であることは保証されていません。

の正しい使い方は freopen は、代入を省略することです。 freopen("newin", "r", stdin);