2010-01-27 31 views
5

我運行一個程序,並重定向cout到outfile中,像這樣:將cout重定向到outfile時,是否可以對終端執行cout操作?

./program <infile.in> outfile.o 

我希望能夠在一個選項,讀取命令(「-h」或「--help」)並輸出幫助信息給終端。有沒有辦法可以做到這一點,但仍然有從程序的其餘部分經常cout去outfile?

cout是否適合用於這樣的事情?

回答

15

您應該使用CERR輸出你的幫助信息到STDERR,這是不包含在您的重定向outfile.o。

鑑於./program <infile.in> outfile.o

cout << "This writes to STDOUT, and gets redirected to outfile."; 
cerr << "This doesn't get redirected, and displays on screen."; 

如果,以後,要重定向標準輸出和STDERR,你可以做

./program < infile.in &> outfile.o 

如果要重定向只STDERR,但允許STDOUT到顯示,使用

./program < infile.in 2> outfile.o 

Bash redirection比大多數複雜人們意識到,除了最簡單的形式(「>」)之外,通常都會被忽視。

+0

真棒,感謝您的幫助! – zebraman 2010-01-27 22:06:55

0

您應該使用cerr而不是cout。使用shell重定向>只重定向stdout(cout),而不是stderr(cerr)。

1

您可能希望將幫助消息輸出到stderr。 Stderr通常用於非正常輸出,您可能會認爲使用段落是這樣的輸出。

2

~$ cmd | tee log_file到DUP stdout到文件終端
~$ cmd 2>log_file打印stdout到終端和stderr到一個文件

1

我所做的一件事情 - 並不是說​​這總是合適的 - 就是編寫具有類似此簽名的模塊。

void write_out(ostream &o); 

,然後我可以創建fstream的對象,並通過他們,或傳遞cout和CERR,無論我需要在那個時候。這對編寫日誌代碼很有幫助,有時候您想要在終端上看到發生的事情,而在其他時候您只需要一個日誌文件。

HTH。

3

如果你在linux上,你可以使用僞設備/dev/tty輸出到控制終端(如果有的話)。即使stderr重定向以及stdout,這也可以工作。其他操作系統可能提供類似的機制。

E.g.

#include <iostream> 
#include <ostream> 
#include <fstream> 

int main() 
{ 
     std::ofstream term("/dev/tty", std::ios_base::out); 

     term << "This goes to terminal\n"; 
     std::cout << "This goes to stdout\n"; 

     return 0; 
} 

會像這樣:

 
$ ./a.out 
This goes to stdout 
This goes to terminal 
$ ./a.out >/dev/null 
This goes to terminal 

注意,有兩個流被緩衝獨立的相對順序,如果他們輸出到同一個設備不一定保存的方式。這可以通過在適當的時間沖洗流來調整。