如何在C ++中刷新重定向的标准输出

时间:2013-07-29 01:51:26

标签: c++ redirect stdout flush

我有以下代码,由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”没有打印或刷新。

然后我输入“退出”,输出就像:

aaa
bbb
bbb
bbb
bbb

我已经尝试了以下方法进行刷新,但是没有方法可以立即刷新字符串。

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


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

1 个答案:

答案 0 :(得分:1)

我担心你将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;
}