我运行一个
$我的程序.exe
主函数签名是哪个int main(int argc, char *argv[])
程序获取一个参数作为目录路径,并对其中的文件进行一些处理。在处理过程中,它会将一些结果打印到标准输出(或标准错误)。我想将这些结果重定向到文件。所以我运行我的程序如下:
$ myprogram.exe C:\dir > res.txt
结果仍会打印到屏幕上并res.txt
保持空白。我该如何解决这个问题?
您的程序可能会将结果打印到标准错误流( stderr
),而不是标准输出流( stdout
)。
要重定向stderr
,(即文件描述符2
),请使用
myprogram.exe C:\dir 2> res.txt
如果要同时重定向and stdout
,stderr
则应将它们重定向到不同的文件,例如
myprogram.exe C:\dir > res.txt 2> errors.txt
或将一个流重定向到另一个流并将后者重定向到文件
myprogram.exe C:\dir >res.txt 2>&1
要记住的一件事是 ">" 运算符将标准输出重定向到输出屏幕,而不是标准错误,为了重定向标准错误,您也需要编写 2>res.txt,所以它应该是 1>res.txt 2>res。 txt,我没有尝试过,所以它可能会因为重定向到同一个文件而出错,所以更安全的方法是:1>res.txt 2>&1
正确发送你的论点,如果你想同时发送stdout
和stderr
文件使用:
$ myprogram.exe "C:\dir" > rest.txt 2>&1
>
您可以在标志之前使用要重定向的文件描述符的数量。当我们使用时2>&1
,文件描述符TWO
(stderr
)被重定向到文件描述符ONE
,这使得stderr
输出结果显示为stdout
.
由于这个问题是用 C++ 标签问的,这里是如何将输出重定向到程序内部std::cout
和std::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++ 流对象的输出,即它不会重定向发送到stdout
or的输出stderr
。