C++ 将函数的std输出附加到文件

C++ 将函数的std输出附加到文件,c++,C++,假设我有一个函数。它将输出打印到std.out。是否有一种方法可以单独捕获函数的打印输出?然后将捕获的输出附加到一个文件。如果您不想像a.out>>output.txt那样重定向程序输出(这将重定向所有输出),您可以将std::cout重定向到一个文件(假设您也不想在f()中修改代码以使用fstream) 简单的例子: #include <iostream> #include <fstream> #include <streambuf> void f() {

假设我有一个函数。它将输出打印到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;
}

如果您有权访问函数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 << ...
文件使用情况(使用stringstream模拟):

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 | sed-e'1,$s/'>>output.txt
    
    可能的重复:
    std::stringstream ss;
    foo(3,4,ss);
    
    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);