gpt4 book ai didi

c++ - 将函数的标准输出附加到文件

转载 作者:行者123 更新时间:2023-11-30 02:39:52 25 4
gpt4 key购买 nike

假设我有一个函数。它将输出打印到 std.out。有没有办法单独捕获函数的打印输出?然后将捕获的输出附加到文件中。

最佳答案

如果你不想像a.out >> output.txt那样重定向程序输出(这会重定向所有输出),你可以重定向std::cout 到文件(假设您不想修改 f() 中的代码以使用 fstream)

简单的例子:

#include <iostream>
#include <fstream>
#include <streambuf>

void f()
{
std::cout << "Say something\n";
}

int main()
{
std::cout << "Writing to file..." << std::endl;

std::ofstream ofile("output.txt", std::fstream::app); // output file
std::streambuf *oldbuf = std::cout.rdbuf(); // save the buffer
std::cout.rdbuf(ofile.rdbuf()); //redirect to output.txt

f(); // call f

// now redirect back
std::cout.rdbuf(oldbuf);

std::cout << "Done writing to file" << std::endl;
}

注意:如果您使用 std::cout 而不是使用 prinf 进行打印,则以上内容有效。您甚至可以编写一个类似 RAII 的类,自动重定向 cout 并且其析构函数重定向回来,如下所示:

#include <iostream>
#include <fstream>
#include <streambuf>

class RAIIcout_redirect
{
std::streambuf* _oldbuf;
public:
RAIIcout_redirect(std::ofstream& os): _oldbuf(std::cout.rdbuf())
{
std::cout.rdbuf(os.rdbuf());
}
~RAIIcout_redirect()
{
std::cout.rdbuf(_oldbuf);
}
};

void f()
{
std::cout << "Say something\n";
}

int main()
{
std::cout << "Writing to file..." << std::endl;
std::ofstream ofile("output.txt", std::fstream::app); // output file

// local scope, at exit cout is redirected back automatically
{
RAIIcout_redirect tmp(ofile);
f(); // call f
} // now redirect back because of ~RAIIcout_redirect()

std::cout << "Done writing to file" << std::endl;
}

关于c++ - 将函数的标准输出附加到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29464578/

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