在将cout重定向到输出文件时,是否可能将内容同时输出到终端?

6

我正在运行一个程序,并将cout重定向到一个输出文件,像这样:

./program < infile.in > outfile.o  

我想能够从命令行读取选项(“-h”或“--help”),并在终端输出帮助信息。 我是否可以这样做但仍然使程序的常规cout转到outfile?

使用cout对象是否正确?

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.";

如果您稍后想要重定向标准输出和错误输出,可以执行以下操作:
./program < infile.in &> outfile.o

如果您想仅重定向错误输出(STDERR),但允许标准输出(STDOUT)显示,请使用以下命令:

./program < infile.in 2> outfile.o

Bash重定向比大多数人意识到的要复杂得多,通常除了最简单的形式(">")以外,其他所有内容都被忽视了。


4
如果你在Linux上操作,可以使用类似设备/dev/tty来输出到控制终端(如果有的话)。即使stderrstdout都被重定向,这种方法也能生效。其他操作系统可能提供类似的机制。
例如:
#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)

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


3

~$ cmd | tee log_filestdout 复制到文件和终端
~$ cmd 2>log_filestdout 输出到终端,将 stderr 输出到文件


1

我所做的事情之一(并不是说这总是合适的)是编写具有类似于这个签名的模块。

void write_out(ostream &o);

然后我可以创建fstream对象并将它们传递进去,或者传递cout和cerr,无论我在那个时候需要什么。这对编写日志记录代码非常有帮助,有时您想要在终端上看到发生了什么,而其他时候则只想要一个日志文件。

希望对你有所帮助。


1

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接