gpt4 book ai didi

c++ - 重定向后重置 cout

转载 作者:太空狗 更新时间:2023-10-29 20:05:41 25 4
gpt4 key购买 nike

我有一个 C++ 程序,在我使用的程序中:

static ofstream s_outF(file.c_str());
if (!s_outF)
{
cerr << "ERROR : could not open file " << file << endl;
exit(EXIT_FAILURE);
}
cout.rdbuf(s_outF.rdbuf());

意思是我将我的 cout 重定向到一个文件。将 cout 返回到标准输出的最简单方法是什么?

谢谢。

最佳答案

在更改 cout 的 streambuf 之前保存旧的 streambuf:

auto oldbuf = cout.rdbuf();  //save old streambuf

cout.rdbuf(s_outF.rdbuf()); //modify streambuf

cout << "Hello File"; //goes to the file!

cout.rdbuf(oldbuf); //restore old streambuf

cout << "Hello Stdout"; //goes to the stdout!

你可以写一个 restorer 来自动完成:

class restorer
{
std::ostream & dst;
std::ostream & src;
std::streambuf * oldbuf;

//disable copy
restorer(restorer const&);
restorer& operator=(restorer const&);
public:
restorer(std::ostream &dst,std::ostream &src): dst(dst),src(src)
{
oldbuf = dst.rdbuf(); //save
dst.rdbuf(src.rdbuf()); //modify
}
~restorer()
{
dst.rdbuf(oldbuf); //restore
}
};

现在基于作用域使用它:

cout << "Hello Stdout";      //goes to the stdout!

if ( condition )
{
restorer modify(cout, s_out);

cout << "Hello File"; //goes to the file!
}

cout << "Hello Stdout"; //goes to the stdout!

最后一个 cout 将输出到 stdout 即使 conditiontrueif block 被执行。

关于c++ - 重定向后重置 cout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12184251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com