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