说我有一个功能。它有输出到std.out的打印件。有没有办法单独捕获功能的打印输出?然后将捕获的输出附加到文件中。
答案 0 :(得分:2)
如果您不想重定向程序输出,如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;
}
答案 1 :(得分:1)
如果您可以访问函数src,则可以修改签名以传入您希望该函数写入的ostream。添加默认值以最小化对其他调用的影响。
头:
void foo(int x, int y, std::ostream& an_ostream = std::cout);
实现:
void foo(int x, int y, std::ostream& an_ostream)
{
an_ostream << ...
用于std :: out:
foo(1,2);
用于文件(用stringstream模拟):
std::stringstream ss;
foo(3,4,ss);
输出到cerr:
foo(5,6,std::cerr);
压制输出:
std::ofstream nullDev; // do not open
// set error, ignore errors
nullDev.setstate(std::ios_base::badbit);
// do not close
foo(7,8,nullDev);
答案 2 :(得分:0)
这是一个疯狂的建议。
a.out | grep <token> | sed -e '1,$s/<token>//' >> output.txt