2015-04-06 57 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