2014-05-20 52 views
3

如何將stdout和stderr重定向到C++中的單個文件?將stdout和stderr重定向到C++中的單個文件

我的嘗試是:

if((LogStream = freopen(strFilePath.c_str(), "w", stdout)) == NULL) 
{ 
    cout << "Failed to redirect console logs\n"; 
} 
if((LogStream = freopen(strFilePath.c_str(), "a", stderr)) == NULL) 
{ 
    cout << "Failed to redirect console logs\n"; 
} 

但它不工作,我的預期。

在此先感謝

+2

當您使用'>> file.log 2>&1'運行它時,您可能會重定向它「 –

+2

」未按預期工作。這裏沒有有用的信息。你在觀察什麼?你期望觀察什麼? –

+0

什麼不按預期工作。 ''無法重定向控制檯日誌\ n「;'只有打開文件失敗時纔會打印。 嘗試在if塊之後添加行以檢查文件是否已正確打開。 – Singh

回答

3

這裏是你如何改變每個原始文件/ C緩衝文件/ C++緩衝流:

#include <unistd.h> 
#include <cstdio> 
#include <iostream> 
#include <cstring> 

using namespace std; 

int main() { 
    // unbuffered system-call level write() access: 
    ::fclose(stderr); 
    if (::dup2(STDOUT_FILENO, STDERR_FILENO) == -1) { 
    cout << "dup2() failed!" << endl; 
    return -1; 
    } 
    char msg_err[] = "write(STDERR_FILENO) OK.\n"; 
    char msg_out[] = "write(STDOUT_FILENO) still OK.\n"; 
    write(STDERR_FILENO, msg_err, strlen(msg_err)); 
    write(STDOUT_FILENO, msg_out, strlen(msg_out)); 

    // buffered C-style access: (ordering may be weird w/o fflush()) 
    stderr = ::fdopen(STDOUT_FILENO, "a"); 
    fprintf(stderr, "fprintf(stderr) OK.\n"); 
    fprintf(stdout, "fprintf(stdout) still OK.\n"); 

    // buffered C++ access: 
    std::cerr.rdbuf(std::cout.rdbuf()); 
    cerr << "cerr << OK.\n"; 
    cout << "cout << still OK.\n"; 
} 

儘管如此,它仍然是更好地從調用shell這樣做。

+0

你能解釋一下更多細節嗎?我不知道如何使用原始文件描述符 –

相關問題