我正在运行一个程序,并将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.";
./program < infile.in &> outfile.o
如果您想仅重定向错误输出(STDERR),但允许标准输出(STDOUT)显示,请使用以下命令:
./program < infile.in 2> outfile.o
Bash重定向比大多数人意识到的要复杂得多,通常除了最简单的形式(">")以外,其他所有内容都被忽视了。
/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 这将被输出到标准输出流(stdout) 这将被输出到终端(terminal) $ ./a.out >/dev/null 这将被输出到终端(terminal)
请注意,由于两个流独立缓冲,如果它们输出到同一设备,则它们的相对顺序不一定被保留。可以通过在适当的时间刷新流来调整。
~$ cmd | tee log_file
将 stdout
复制到文件和终端
~$ cmd 2>log_file
将 stdout
输出到终端,将 stderr
输出到文件
我所做的事情之一(并不是说这总是合适的)是编写具有类似于这个签名的模块。
void write_out(ostream &o);
然后我可以创建fstream对象并将它们传递进去,或者传递cout和cerr,无论我在那个时候需要什么。这对编写日志记录代码非常有帮助,有时您想要在终端上看到发生了什么,而其他时候则只想要一个日志文件。
希望对你有所帮助。
您可能希望将帮助信息输出到stderr。 Stderr通常用于非正常输出,您可以将使用段落视为此类输出。
你应该使用 cerr 而不是 cout。使用 shell 重定向 > 只会重定向 stdout(cout),而不是 stderr(cerr)。