我運行一個程序,並重定向cout
到outfile中,像這樣:將cout重定向到outfile時,是否可以對終端執行cout操作?
./program <infile.in> outfile.o
我希望能夠在一個選項,讀取命令(「-h」或「--help」)並輸出幫助信息給終端。有沒有辦法可以做到這一點,但仍然有從程序的其餘部分經常cout
去outfile?
cout
是否適合用於這樣的事情?
我運行一個程序,並重定向cout
到outfile中,像這樣:將cout重定向到outfile時,是否可以對終端執行cout操作?
./program <infile.in> outfile.o
我希望能夠在一個選項,讀取命令(「-h」或「--help」)並輸出幫助信息給終端。有沒有辦法可以做到這一點,但仍然有從程序的其餘部分經常cout
去outfile?
cout
是否適合用於這樣的事情?
您應該使用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比大多數複雜人們意識到,除了最簡單的形式(「>」)之外,通常都會被忽視。
您應該使用cerr而不是cout。使用shell重定向>只重定向stdout(cout),而不是stderr(cerr)。
您可能希望將幫助消息輸出到stderr。 Stderr通常用於非正常輸出,您可能會認爲使用段落是這樣的輸出。
~$ cmd | tee log_file
到DUP stdout
到文件和終端
~$ cmd 2>log_file
打印stdout
到終端和stderr
到一個文件
我所做的一件事情 - 並不是說這總是合適的 - 就是編寫具有類似此簽名的模塊。
void write_out(ostream &o);
,然後我可以創建fstream的對象,並通過他們,或傳遞cout和CERR,無論我需要在那個時候。這對編寫日誌代碼很有幫助,有時候您想要在終端上看到發生的事情,而在其他時候您只需要一個日誌文件。
HTH。
如果你在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
注意,有兩個流被緩衝獨立的相對順序,如果他們輸出到同一個設備不一定保存的方式。這可以通過在適當的時間沖洗流來調整。
真棒,感謝您的幫助! – zebraman 2010-01-27 22:06:55