将标准输出重定向到文件[重复]
Posted
技术标签:
【中文标题】将标准输出重定向到文件[重复]【英文标题】:Redirecting stdout to file [duplicate] 【发布时间】:2013-01-18 16:05:16 【问题描述】:可能重复:How to redirect cin and cout to files?
我正在调试一些意大利面条代码,这些代码通过 std::cout 和名为 tecla 的第三方库写入终端:
http://www.astro.caltech.edu/~mcs/tecla/
我想将自己连接到标准输出,以便将其重定向到文件。在保存到文件之前,我可以将字符串转换为十六进制表示,以便我可以更轻松地识别它们包含的所有控制字符。
我还可以将程序中的各种事件记录到这个文件中,以便更好地了解程序是如何工作的。
对我如何做到这一点有什么建议吗?
更新
我的程序还通过 std 输入在终端上接收命令。好像在做:
我的程序 9889 > output.txt
甚至
我的程序 9889 | xxd
以某种方式中断程序,以至于我似乎无法让程序响应输入的命令。
提示符 (>) 没有出现在 output.txt 中。
【问题讨论】:
你可以通过说process > filename
在终端/windows命令行中保存任何进程的输出
【参考方案1】:
如果您在 UNIX-oid 系统上,除了直接存储到文件中(如其他答案中所示)之外,您还可以使用 HEX 编码查看它,并通过组合 hexdump
和使用光标键浏览它less
:
./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
要同时查看(使用less浏览)+保存在文件中,只需在此命令管道中添加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 | ...
【讨论】:
在 windows 上,即使在执行 windows 控制台应用程序时,您也可以使用 cygwin 以与上述相同的语法访问 hexdump 和 less。 @leemes 请看我上面的更新,谢谢。 @Baz 你试过tee
命令了吗?这将在终端上输出您的进程的stdout
,并允许您对stdin
进行一些输入。应该是无缝的(它在指定的文件名中记录为 copy,而不是 redirect)【参考方案2】:
写信给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
就会输出
到你指定的文件。
【讨论】:
为什么写信给std::cout
是非常糟糕的做法?【参考方案3】:
将输出重定向到文件是您通常在命令行上执行的操作,而不是在代码本身中执行的操作。例如:
myProgram > output.txt
【讨论】:
它不仅是 bash,它也是 Windows CLI 的相同语法。 :) (./
除外)
谢谢!我不会在 Windows 终端上花费太多时间。
@slavik262 请看我上面的更新,谢谢。
@Baz 将stdout
定向到文件或其他程序根本不应该中断输入。我不确定是什么导致了问题。【参考方案4】:
只需键入以下内容即可运行您的程序:
myprogram > output.txt
然后使用 WinHex 或 ghex2 等十六进制编辑器查看 output.txt 文件。
【讨论】:
请看我上面的更新,谢谢。【参考方案5】:如果您正在调试的程序对它是否与终端通信很敏感,您可以查看screen
,尤其是its logging capabilities。
【讨论】:
以上是关于将标准输出重定向到文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章