5

我正在运行一个程序并重定向cout到一个输出文件,如下所示:

./program < infile.in > outfile.o  

我希望能够从命令行读取一个选项(“-h”或“--help”)并向终端输出帮助消息。有没有办法我可以做到这一点,但仍然让cout程序其余部分的常规进入输出文件?

cout将是用于这种事情的正确对象吗?

4

6 回答 6

16

您应该使用 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 重定向比大多数人意识到的要复杂得多,而且通常除了最简单的形式 (">") 之外的所有内容都会被忽略。

于 2010-01-27T21:23:55.947 回答
3

如果您使用的是 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
这去终端

请注意,两个流独立缓冲的方式,如果它们输出到同一设备,则不一定保留相对顺序。这可以通过在适当的时间冲洗流来调整。

于 2010-01-27T22:28:16.610 回答
2

~$ cmd | tee log_file复制stdout到文件终端
~$ cmd 2>log_file以打印stdout到终端和stderr文件中

于 2010-01-27T21:23:53.140 回答
1

您可能希望将帮助消息输出到 stderr。Stderr 通常用于非正常输出,您可以将使用段落视为此类输出。

于 2010-01-27T21:23:36.277 回答
1

我做过的一件事——并不是说这总是合适的——是编写具有类似这个签名的模块。

void write_out(ostream &o);

然后我可以创建 fstream 对象并将它们传入,或者传入 cout 和 cerr,无论我当时需要什么。这对于编写日志代码很有帮助,有时您想在终端上查看发生了什么,而在其他时候您只需要一个日志文件。

HTH。

于 2010-01-27T22:11:26.513 回答
0

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

于 2010-01-27T21:23:14.730 回答