我正在运行程序并将cout
重定向到outfile,如下所示:
./program < infile.in > outfile.o
我希望能够从命令行读取选项('-h'或'--help')并向终端输出帮助消息。有没有办法可以做到这一点,但仍然有其他程序的常规cout
转到outfile?
cout
会成为用于此类事情的正确对象吗?
答案 0 :(得分: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.";
如果稍后要重定向STDOUT和STDERR,则可以执行
./program < infile.in &> outfile.o
如果您只想重定向STDERR,但允许显示STDOUT,请使用
./program < infile.in 2> outfile.o
Bash redirection比大多数人意识到的要复杂得多,除了最简单的形式(“&gt;”)之外,其他所有内容都会被忽视。
答案 1 :(得分: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
请注意,如果两个流独立地缓冲相对排序(如果它们输出到同一设备)的方式不一定保留。这可以通过在适当的时间冲洗流来调整。
答案 2 :(得分:2)
~$ cmd | tee log_file
将stdout
复制到和终端
~$ cmd 2>log_file
将stdout
打印到终端,将stderr
打印到文件
答案 3 :(得分:1)
您可能希望将帮助消息输出到stderr。 Stderr通常用于非正常输出,您可以将使用段落视为此类输出。
答案 4 :(得分:1)
我做过的其中一件事 - 不是说这总是合适的 - 是编写具有类似签名的模块。
void write_out(ostream &o);
然后我可以创建fstream对象并传入它们,或传入cout和cerr,无论我当时需要什么。这有助于编写日志代码,有时您希望在终端上查看发生的情况,有时您只需要日志文件。
HTH。
答案 5 :(得分:0)
你应该使用cerr而不是cout。使用shell重定向&gt;只重定向stdout(cout),而不是stderr(cerr)。