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 回答