2

假设我有类似的代码

#include <iostream>
using namespace std;

int main() {
    cout << "Redirect to file1" << endl;
    cout << "Redirect to file2" << endl;
    return 0;
}

我想将第一个输出重定向到 file1,将第二个输出重定向到 file2。那可能吗?

我认为在 C 中,fclose(stdout)重新打开stdout可能会有所帮助,但我不确定如何重新打开它或它是否有效。

谢谢

更新:为了什么?

我有一个程序 A,它从用户那里读取输入并生成相应的输出。现在我想检查它是否正确,我有一个程序 B,它为 A 生成输入,以及正确的输出。B 将一次生成一组测试数据。我将进行数千次测试。

在我的机器上,一千倍的./B > ``mktemp a.XXX``效果比使用ofstream. 使用fstream数千次,我的硬盘灯疯狂闪烁。但不是在重定向到临时文件时。

更新2:

在 C++ 中,流行的答案似乎coutcerr.

除了 C 之外stderr,我可以关闭stdout并重新打开它吗?

4

5 回答 5

3

为什么不使用文件流?这样,无论 shell 重定向如何,它很可能都可以工作:

#include <fstream>
#include <fstream>
using namespace std;
// opeen files
ofstream file1 ( "file1");
ofstream file2 ( "file2");
//write
file1 << "Redirect to file1" << endl;
file2 << "Redirect to file2" << endl;
//close files
file1.close();
file2.close();
于 2012-11-12T13:23:45.817 回答
2

您可以使用 cout 和 cerr。

cout << "Redirect to file1" << endl;
cerr << "Redirect to file2" << endl;

cerr 进入标准错误

于 2012-11-12T13:24:31.547 回答
1

您始终可以将标准错误流用于例如错误消息。

#include <iostream>
using namespace std;

int main() {
    cout << "Redirect to file1" << endl;
    cerr << "Redirect to file2" << endl;
}

例如,使用 Windows [cmd.exe] 命令解释器和 Visual C++cl编译器:

[D:\开发\测试]
> type con >streams.cpp 
#include <iostream> 
using namespace std;

int main() { 
    cout << "重定向到 file1" << endl; 
    cerr << "重定向到文件2" << endl; 
} 
^Z

[D:\开发\测试]
> cl 流.cpp
流.cpp

[D:\开发\测试]
>流 1>a.txt 2>b.txt

[D:\开发\测试]
>键入 a.txt
重定向到文件 1

[D:\开发\测试]
>键入 b.txt
重定向到文件 2

[D:\开发\测试]
> _


编辑:添加了彩色代码和粗体强调。

于 2012-11-12T13:23:55.113 回答
1

另一种方法是这样使用cout.rdbuf()

#include <iostream>
#include <fstream>
using namespace std;

int main () {
    ofstream cfile1("test1.txt");
    ofstream cfile2("test2.txt");

    cout.rdbuf(cfile1.rdbuf());        
    cout << "Redirect to file1" << endl;

    cout.rdbuf(cfile2.rdbuf());        
    cout << "Redirect to file2" << endl; 

    return 0;
}
于 2012-11-12T13:28:13.280 回答
1

代码:

#include <iostream>
using namespace std;

int main() {
    cout << "Redirect to file1" << endl;
    cerr << "Redirect to file2" << endl;
    return 0;
}

安慰:

test > 1.txt 2> 2.txt

1.txt:

Redirect to file1

2.txt:

Redirect to file2
于 2012-11-12T13:30:22.707 回答