我想做重定向標準輸出/標準錯誤到UNIX下的C++文件 - 再次
重定向輸出和錯誤從內C++
到一個或多個文件是什麼,爲什麼我需要它
我正在使用一個外部的,預編譯的第三方庫,產生一個荒謬的輸出量,我想重定向到一個日誌文件以保持控制檯清潔。
條件
兼容性是沒有問題的,代碼將只在Unix系統上運行。重定向不僅應該影響C++樣式的打印(std :: cout < <「hello world」< < std :: endl),還要打印c樣式(printf(「hello world \ n」))。
我已經試過到目前爲止
我一直在計算器上瀏覽了半天,讀取多個答案具有類似問題的人。有了這些答案的幫助下,我已經能夠總結了以下的一段代碼:
#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
也就是說,當使用這個機制第一次,它的工作原理 - 但如果再次使用,恢復輸出將無法正常工作。 有人可以指出我需要改變什麼以使機制無限地工作嗎?
可能重複:http://stackoverflow.com/questions/4810516/c-redirecting-stdout – Kelm