将函数的std输出附加到文件中
Append std output of a function to a file
假设我有一个函数。它将输出打印到std.out。有没有办法单独捕获函数的打印输出?然后将捕获的输出附加到文件中。
如果你不想像a.out >> output.txt
那样重定向程序输出(这将重定向所有输出),你可以将std::cout
重定向到一个文件(假设你也不想修改f()
中的代码以使用fstream
)
简单示例:
#include <iostream>
#include <fstream>
#include <streambuf>
void f()
{
std::cout << "Say somethingn";
}
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 somethingn";
}
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;
}
如果您有权访问函数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 << ...
用法out to std::out:
foo(1,2);
文件用法(使用字符串流模拟):
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);
这里有一个疯狂的建议。
- 在函数的每一行输出前加上一个唯一的标记
- 然后,使用:
a.out | grep <token> | sed -e '1,$s/<token>//' >> output.txt
相关文章:
- 如何在 的开头<x>和结尾<y>之间更改带有文件输出的字符串的值
- C++对象数组的文件输出
- bcdedit 文件输出不起作用,但其他命令可以
- 如何从文本文件输出数据?(学生成绩单计划)
- 使用 C++文件 I/O 输出 pdf 文件
- C 文件输出垃圾
- 从堆栈中读取字符后,如何修复不正确的文件输出
- C++:具有随机名称的文件输出
- 在命令提示符下看到换行符,但在文件输出中可以看到 相同的字符串
- 生成文件不会生成预期的文件输出
- C++11 fgetc 在"r+b"模式下使用时向我的文件输出 0
- 使用函数从文件输出
- GCC.obj文件输出不具有确定性(.debug_info,PROGPITS部分)
- C cstdiofile :: Writestring给出了不正确的文件输出
- C 输出:STD :: COUT和文件输出没有相同的内容
- GCC和MSVC之间的文件输出不一致
- C++文件输出奇怪的数字,并且部分代码没有运行
- 如何将特定字符从TXT文件输出到特定点
- C 调用从TXT文件输出信息的函数
- 将交易从文本文件输出到屏幕