将带有参数的程序输出重定向到该文件

时间:2012-11-23 20:26:42

标签: c++ redirect count

我跑了

  

$ myprogram.exe

哪个主要功能签名是int main(int argc, char *argv[]) 程序将一个参数作为目录路径,并对其中的文件进行一些处理。 在处理过程中,它会将一些结果打印到stdout(或stderr)。 我想将这些结果重定向到该文件。所以我运行我的程序如下:

  

$ myprogram.exe C:\ dir> res.txt

结果仍会打印在屏幕上,res.txt仍为空。 我该如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

您的程序可能会将结果打印到标准错误流stderr),而不是标准输出流stdout)。

要重定向stderr,(文件描述符2),请使用

myprogram.exe C:\dir 2> res.txt 

如果您要重定向 stdoutstderr,则应将其重定向到不同的文件,例如

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)

正确发送您的论据,如果您要将stdoutstderr同时发送到文件使用:

  

$ myprogram.exe“C:\ dir”> rest.txt 2>& 1

您可以使用要在>符号前重定向的文件描述符数。当我们使用2>&1时,文件描述符TWOstderr)被重定向到文件描述符ONE,这使得stderr输出结果显示为{{1} }}

答案 3 :(得分:0)

由于这个问题是用C ++标记询问的,这里是如何将输出重定向到程序中的std::coutstd::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 ++流对象的输出,即它不会重定向发送到stdoutstderr的输出。