2015-04-06 65 views
1

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

+2

我有一个函数。 – 2015-04-06 02:43:12

+0

可能的重复:http://stackoverflow.com/questions/10150468/how-to-redirect-cin-and-cout-to-files – 2015-04-06 03:17:32

回答

1

如果你不想程序输出重定向像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; 
} 
+0

哇,这是一个非常干净的答案。它完美地工作。 – passingbyou 2015-04-06 03:01:18

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 ::出来:

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); 
0

这是一个疯狂的建议。

  1. 在函数的每一行输出上添加一个唯一的标记。
  2. 然后,使用:
a.out | grep <token> | sed -e '1,$s/<token>//' >> output.txt