2012-11-15 74 views
1

我有一個使用std :: cout打印到屏幕的C++程序。當程序作爲服務運行時重定向std :: cout

有時我需要將它作爲服務運行。當它作爲Windows服務運行時,有什麼方法可以看到cout輸出嗎?

重定向輸出到一個文件或某種調試程序將是理想的。

顯然,我可以用寫入文件的函數替換cout,這可能是我要做的,但我很想知道是否有其他解決方案。

+1

在Unix系統上,您可以在啓動進程時重定向標準輸出,但在Windows中我並不熟悉這樣的內容。可能它應該存在。 –

+0

啓動過程或管道後重定向標準輸出正是我所需要的。 – Meir

+0

嘗試在Windows中對此功能進行一些研究。應該有這樣的東西。我會谷歌的東西,如「在Windows中重定向輸出過程」。 –

回答

2

基本上有無限的選擇。最初的幾個浮現在腦海:

圍繞一個ostream參考

你可以繞過一個std :: ostream的參考:

void someFunc(std::ostream& out) { 
    //someFunc doesn't need to know whether out is a file, cout, or whatever 
    out << "hello world" << std::endl; 
} 

更換cout基礎緩衝區與文件

來自cplusplus.com的示例:

streambuf *psbuf, *backup; 
ofstream filestr; 
filestr.open ("test.txt"); 

backup = cout.rdbuf();  // back up cout's streambuf 

psbuf = filestr.rdbuf(); // get file's streambuf 
cout.rdbuf(psbuf);   // assign streambuf to cout 

cout << "This is written to the file"; 

這裏有一個帶有freopen的單引號,但是我有一種爬行的感覺(並且this似乎在註釋中重新強調它),它是未定義的行爲,因爲stdin和cout可以不同步。

freopen("/path/to/file", "r", stdout); 
//cout is now writing to path/to/file 

一個日誌庫

不是我頭頂的一個很好的肯定,但你可以去完全展開,使用某種類型的日誌庫。 (還有的Windows事件,雖然這取決於你輸出什麼,那可能沒有什麼意義。)

管道

我懷疑這是可能的Windows服務,但如果是,總是有經典重定向:

blah.exe > C:\path\file 
1

簡單的解決方案是SetStdHandle(STD_OUTPUT_HANDLE, your_new_handle)

相關問題