我跑了
$ myprogram.exe
哪个主要功能签名是int main(int argc, char *argv[])
程序将一个参数作为目录路径,并对其中的文件进行一些处理。
在处理过程中,它会将一些结果打印到stdout(或stderr)。
我想将这些结果重定向到该文件。所以我运行我的程序如下:
$ myprogram.exe C:\ dir> res.txt
结果仍会打印在屏幕上,res.txt
仍为空。
我该如何解决这个问题?
答案 0 :(得分:3)
您的程序可能会将结果打印到标准错误流(stderr
),而不是标准输出流(stdout
)。
要重定向stderr
,(文件描述符2
),请使用
myprogram.exe C:\dir 2> res.txt
如果您要重定向 stdout
和stderr
,则应将其重定向到不同的文件,例如
myprogram.exe C:\dir > res.txt 2> errors.txt
或将一个流重定向到另一个流并将后者重定向到文件
myprogram.exe C:\dir >res.txt 2>&1
答案 1 :(得分:2)
要记住的一件事是“>” operator将stdout重定向到输出屏幕,而不是stderr,用于重定向stderr,你需要写2> res.txt,所以它应该是1> res.txt 2> res.txt, 我没有尝试它因为重定向到同一个文件会导致错误,所以更安全的方法是: 1> res.txt 2>& 1
答案 2 :(得分:1)
正确发送您的论据,如果您要将stdout
和stderr
同时发送到文件使用:
$ myprogram.exe“C:\ dir”> rest.txt 2>& 1
您可以使用要在>
符号前重定向的文件描述符数。当我们使用2>&1
时,文件描述符TWO
(stderr
)被重定向到文件描述符ONE
,这使得stderr
输出结果显示为{{1} }}
答案 3 :(得分:0)
由于这个问题是用C ++标记询问的,这里是如何将输出重定向到程序中的std::cout
和std::cerr
(这是代码泄漏的一点点黑客)指向std::filebuf
的指针,但必要时可以阻止这样做:
int main() {
std::filebuf* fb = new std::filebuf;
fb->open("res.txt", std::ios_base::out);
std::cout.rdbuf(fb);
std::clog.rdbuf(fb);
std::cerr.rdbuf(fb);
...
}
当然,这只适用于写入标准C ++流对象的输出,即它不会重定向发送到stdout
或stderr
的输出。