0

我运行一个

$我的程序.exe

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

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

结果仍会打印到屏幕上并res.txt保持空白。我该如何解决这个问题?

4

4 回答 4

3

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

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

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

如果要同时重定向and stdoutstderr则应将它们重定向到不同的文件,例如

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

或将一个流重定向到另一个流并将后者重定向到文件

myprogram.exe C:\dir >res.txt 2>&1 
于 2012-11-23T20:32:04.180 回答
2

要记住的一件事是 ">" 运算符将标准输出重定向到输出屏幕,而不是标准错误,为了重定向标准错误,您也需要编写 2>res.txt,所以它应该是 1>res.txt 2>res。 txt,我没有尝试过,所以它可能会因为重定向到同一个文件而出错,所以更安全的方法是:1>res.txt 2>&1

于 2012-11-23T20:40:50.807 回答
1

正确发送你的论点,如果你想同时发送stdoutstderr文件使用:

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

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

于 2012-11-23T20:52:15.617 回答
0

由于这个问题是用 C++ 标签问的,这里是如何将输出重定向到程序内部std::coutstd::cerr从程序内部重定向输出(这有点小技巧,因为代码泄漏了一个指向 a 的指针,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++ 流对象的输出,即它不会重定向发送到stdoutor的输出stderr

于 2012-11-23T20:51:51.107 回答