我想要做什么
在c++中将stdout和stderr重定向到一个或多个文件
为什么需要这样做
我正在使用一个外部的、预编译的第三方库,它产生了大量的输出,我希望将其重定向到一个日志文件中,以保持控制台的清洁。
限制条件
兼容性不是问题,代码只会在Unix系统上运行。重定向不仅应影响c++风格的打印(std::cout << "hello world" << std::endl
),还应该影响c风格的打印(printf("hello world\n")
)。
我已经尝试过的
我在stackoverflow上浏览了半天,阅读了多个回答类似问题的人。借助这些答案,我已经能够组合出以下代码:
#include <stdio.h>
#include <iostream>
#include <fcntl.h>
#include "unistd.h"
const int stdoutfd(dup(fileno(stdout)));
int redirect_stdout(const char* fname){
fflush(stdout);
int newstdout = open(fname, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
dup2(newstdout, fileno(stdout));
close(newstdout);
}
int restore_stdout(){
fflush(stdout);
dup2(stdoutfd, fileno(stdout));
close(stdoutfd);
return stdoutfd;
}
int main(){
redirect_stdout("/dev/null");
std::cout << "invisible 1" << std::endl;
restore_stdout();
std::cout << "visible 1" << std::endl;
redirect_stdout("/dev/null");
std::cout << "invisible 2" << std::endl;
restore_stdout();
std::cout << "visible 2" << std::endl;
return 0;
}
我期望看到的是:
visible 1
visible 2
我实际看到的内容
visible 1
也就是说,第一次使用此机制时,它可以正常工作 - 但如果再次使用,则无法恢复输出。有人能指出我需要更改什么以使机制无限次地工作吗?
编辑:为什么它与其他人所做的不同?
许多人有类似的问题(因此有“再次”,例如here)。然而,在这里,我特别针对适用于C风格和C++风格打印的解决方案,并且特别关注函数的可重用性 - 这通常在其他问题和答案中没有得到解决。
freopen(“output.txt”,“w”,stdout); freopen(“output.txt”,“w”,stderr);
并将标准输出和标准错误都放入同一个文件中。 - darda