17

stdout は端末に接続すると行バッファリングされますが、(少なくとも stdin から) 読み取ると stdout が自動的にフラッシュされることをどこかで読んだことを覚えています。私が使用したすべての C 実装はこれを行っていますが、現在は標準で見つけることができません。

そのように動作することは理にかなっていますが、そうでない場合は次のようにコーディングします。

printf("Type some input: ");
fgets(line, sizeof line, stdin);

余分に必要だろうfflush(stdout);

それで、標準出力はここでフラッシュされることが保証されていますか?

編集:

いくつかの返信が言っているように、私の例では stdout への出力が stdin からの読み取りの前に表示されるという保証は標準にはないようですが、一方で、この意図は (私の無料のドラフトコピー) に記載されています標準:

対話型デバイスの入力および出力ダイナミクスは、7.19.3 で指定されているように行われるものとします。これらの要件の意図は、プログラムが入力を待機する前にプロンプ​​ト メッセージが実際に表示されるようにするために、バッファなしまたは行バッファ付きの出力をできるだけ早く表示することです。

(ISO/IEC 9899:TC2 委員会草案 -- 2005 年 5 月 6 日、14 ページ)。

したがって、保証はないようですが、とにかくほとんどの実装でおそらく動作します。(有名な最後の言葉...)

4

6 に答える 6

5

あなたの質問に答えるには、プログラムが入力を読み取ろうとする前にプロンプ​​トが表示されるようにするために、呼び出しの後に追加が必要です。から読むことはあなたのためではありません。fflush(stdout);printf()stdinfflush(stdout);

于 2010-01-23T14:56:15.560 に答える
5

いいえ、違います。

于 2010-01-23T14:53:35.113 に答える
4

いいえ、fflush(stdout); する必要があります。多くの実装は、出力を端末に送信するすべての改行でフラッシュします。

于 2010-01-23T14:54:58.357 に答える
4

いいえ。stdin/stdout はバッファリングされます。fflush(stdout)ビデオ メモリ/UNIX 端末のメモリにバッファリングされたデータを端末などのビュー デバイスにプッシュするには、明示的に指定する必要があります。データのバッファリングは、 を呼び出して設定できますsetvbuf

編集:質問に答えるためにジョナサンに感謝します。標準入力からの読み取りは標準出力をフラッシュしません。の使用方法を示すコードを指定することで、ここで接線を外した可能性がありますsetvbuf

  #含む

  int main(void)
  {
     FILE *入力、*出力;
     char bufr[512];

     input = fopen("file.in", "r+b");
     output = fopen("file.out", "w");

     /* 最小限のディスク アクセス用に入力ストリームを設定します。
        独自の文字バッファを使用 */
     if (setvbuf(input, bufr, _IOFBF, 512) != 0)
        printf("入力ファイルのバッファの設定に失敗しました\n");
     そうしないと
        printf("入力ファイルのバッファ設定\n");

     /* スペースを使用してライン バッファリング用の出力ストリームをセットアップします。
        malloc への間接呼び出しによって取得されます */
     if (setvbuf(出力, NULL, _IOLBF, 132) != 0)
        printf("出力ファイルのバッファの設定に失敗しました\n");
     そうしないと
        printf("出力ファイルのバッファ設定\n");

     /* ここでファイル I/O を実行します */

     /* ファイルを閉じる */
     fclose(入力);
     fclose(出力);
     0 を返します。
  }

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-01-23T15:03:29.640 に答える
2

いいえ、それは標準の一部ではありません。説明した動作が実際に発生したライブラリ実装を使用した可能性は確かにありますが、それは依存すべきではない非標準の拡張機能です。

于 2010-01-23T15:05:46.127 に答える
1

いいえ。stdin での読み取り時または stdout ブロックでの書き込み時に std ストリームを処理する場合は、プロセス間のデッドロックに注意してください。

于 2010-01-23T15:07:29.277 に答える