1

Visual Studio 2008 でコンパイルされた次のコードがあります。

int main() {
    freopen ("C:\\temp\\stdout.txt","w",stdout);
    cout << "aaa" << endl;
    while (true) {
        string in = "";
        getline(cin, in);
        cout << "bbb" << endl;
        if (in.find("exit") != string::npos) {
            break;
        }
    }
    fclose (stdout);
    return 0;
}

Notepad++ で "C:\temp\stdout.txt" を開き、ファイルの変更を監視します (ファイル タブを手動でクリックして更新します)。

それを実行するとき:

すぐに「aaa」と表示されますが、これは正しいです。

次に「asdf」と入力しますが、「bbb」は出力またはフラッシュされません。

次に「asdf」と入力しますが、「bbb」は出力またはフラッシュされません。

次に「asdf」と入力しますが、「bbb」は出力またはフラッシュされません。

次に「exit」と入力すると、出力は次のようになります。

aaa
bbb
bbb
bbb
bbb

次のフラッシュ方法を試しましたが、文字列をすぐにフラッシュできるものはありません。

cout << "bbb" << endl << flush;


cout << "bbb" << endl;
cout.flush();
4

1 に答える 1

2

残念ながら、ストリーム リダイレクトに対する C のアプローチと C++ を混在させているようです。特にあなたのコードでは、安全に使用できます:

ofstream fout("stdout.txt");
cout.rdbuf(fout.rdbuf());

コンソール出力をファイルにリダイレクトします。std::endl マニピュレーターが自動的に行うため、手動でストリームをフラッシュする必要はありません。

次のコードは正常に動作します。

// *****
#include <iostream>      // for I/O
#include <fstream>       // for file I/O
using namespace std;
// *****

int main() {
    // *****
    // freopen("stdout.txt", "w", stdout);
    ofstream fout("stdout.txt");
    cout.rdbuf(fout.rdbuf());
    // *****
    cout << "aaa" << endl;
    while (true) {
        string in = "";
        getline(cin, in);
        cout << "bbb" << endl;
        if (in.find("exit") != string::npos) {
            break;
        }
    }
    // *****
    // fclose (stdout);
    // *****
    return 0;
}
于 2013-07-29T02:48:52.390 に答える