将stdout重定向到文件

时间:2013-01-18 16:05:16

标签: c++

  

可能重复:
  How to redirect cin and cout to files?

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

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

我想将自己挂钩到stdout,以便我可以将其重定向到文件。在保存到文件之前,我可以将字符串转换为十六进制表示,以便我可以更轻松地识别它们包含的所有控制字符。

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

关于我如何做到这一点的任何建议?

更新

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

myprogram 9889> output.txt的

甚至

myprogram 9889 | XXD

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

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

5 个答案:

答案 0 :(得分:1)

如果您使用的是UNIX-oid系统,除了直接存储到文件中(如其他答案所示),您可以用HEX编码查看它,并通过组合{{1}使用光标键浏览它}和hexdump

less

然后输出如下:

./myProgram | hexdump -C | less

要查看(使用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

答案 1 :(得分: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 到你指定的文件。

答案 2 :(得分:0)

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

myProgram > output.txt

答案 3 :(得分:0)

输入以下命令运行程序:

myprogram > output.txt

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

答案 4 :(得分:0)

如果您正在调试的程序对是否与终端通话很敏感,您可能会查看screen,特别是its logging capabilities