1

tie() に関する iostream の動作を理解しようとしています。私が見つけたものから、以下のコードは画面に何も出力しないはずです。

    cin.tie(NULL);
    int i;
    cout << "TEST";
    cin >> i;
    while (true);

代わりに、次のように動作する必要があります

    cin.tie(NULL);
    int i;
    cout << "TEST";
    read(0, &i, sizeof(int));
    while (true);

つまり、ストリームがアンタイされているにもかかわらず、cin 入力が呼び出されると cout バッファーがフラッシュされます。このコードを g++ 4.8.0 および 4.6.3 でコンパイルしようとしました。また、呼び出しを試みcin.tie()た後cin.tie(NULL)、正しく NULL を返すため、ストリームを関連付けないでください。

私が見逃しているのは、tie() にもっとありますか?

4

1 に答える 1

3

あなたは を実行しなかったcout.sync_with_stdio(false);ので、あなたstd::coutはCI/O と同期されています。つまり、すべての単一の出力は個別にすぐに CI/O ライブラリ呼び出しに送信され、実装で定義された glibc のルールに従います。場合。

簡単なチェックで、この glibc マニュアルには次のように記載されています

...ストリームのバッファリングされた出力は自動的にフラッシュされます:

  • 任意のストリームに対する入力操作が実際にそのファイルからデータを読み取るとき。

(まだ標準入力から何も読み取られていないため、説得力があるようには聞こえませんが..いずれにせよ、cout.sync_with_stdio(false)このcin.tie(NULL)テストケースは私のLinuxで期待どおりに動作します)。

于 2013-02-20T23:34:17.957 に答える