正在将stdout重定向到文件

Redirecting stdout to file

本文关键字:文件 重定向 stdout      更新时间:2023-10-16

可能重复:
如何将cin和cout重定向到文件?

我正在调试一些意大利面条代码,这些代码通过std::cout和名为tecla:的第三方库写入终端

http://www.astro.caltech.edu/~mcs/tecla/

我想把自己挂接到stdout,这样我就可以把它重定向到一个文件。在保存到文件之前,我可以将字符串转换为十六进制表示,这样我就可以更容易地识别它们包含的所有控制字符。

我还可以将程序中的各种事件记录到该文件中,以便更好地了解程序的工作方式。

关于我该怎么做,有什么建议吗?

更新

我的程序还通过std输入在终端上接收命令。它似乎在做:

myprogram 9889>output.txt

甚至

myprogram 9889|xxd

以某种方式扰乱程序,以至于我似乎无法让程序响应输入的命令。

提示(>(不会出现在output.txt中。

如果您在UNIX oid系统上,除了直接存储到文件中(如其他答案所示(,您还可以以HEX编码查看它,并通过组合hexdumpless:使用光标键浏览它

./myProgram | hexdump -C | less

然后输出看起来像:

00000000  73 6f 6d 65 20 63 72 79  70 74 69 63 20 6f 75 74  |some cryptic out|
00000010  70 75 74 20 66 72 6f 6d  20 6d 79 20 70 72 6f 63  |put from my proc|
00000020  65 73 73 0a                                       |ess.|
00000024

要同时查看(浏览使用较少(+保存文件,只需在以下命令管道中添加一个tee命令:

./myProgram | hexdump -C | tee output.txt | less    #for hex-encoded file content
./myProgram | tee output.txt | hexdump -C | less    #for 1:1 file content

要将stderr输出也包含在文件/视图中,请在处理前将两个通道合并,方法是在处理命令行前使用2>&1:

./myProgram 2>&1 | ...

写入std::cout是非常糟糕的做法,除了小测试程序。但既然你被它卡住了,在代码中无法更改:可以将streambuf更改为流写入,内容如下:

class WrappedOutputFilebuf : public std::filebuf
{
    std::ostream& mySavedStream;
    std::streambuf* mySavedStreambuf;
public:
    WrappedOutputFilebuf( std::ostream& stream, std::string filename )
        : mySavedStream( stream)
        , mySavedStreambuf( stream.rdbuf() )
    {
        open( filename.c_str(), std::ios_base::out );
        if ( ! is_open() ) {
            throw some_error;
        }
        stream.rdbuf( this );
    }
    ~WrappedOutputFilebuf()
    {
        mySavedStream.rdbuf( mySavedStreambuf );
    }
};

然后在某个地方申报:

WrappedOutputFilebuf w( std::cout, fileName );

只要变量在范围内,std::cout就会输出到您指定的文件。

将输出重定向到文件通常是在命令行上执行的,而不是在代码本身中执行。例如:

myProgram > output.txt

只需键入即可运行程序

myprogram > output.txt

然后使用十六进制编辑器(如WinHex或ghex2(查看output.txt文件。

如果您正在调试的程序对它是否与终端通信很敏感,那么您可以查看screen,特别是它的日志记录功能。