2015-07-21 50 views
0

在窗口我會用這樣的:重定向標準錯誤到一個臨時文件

strcpy (errorFileName, _tempnam (NULL,"pfx")); 
freopen (errorFileName, "wt", stderr); 

man page在Linux中tempnam特別說使用它,並使用mkstemp代替。很公平。但是它會返回一個文件描述符。有沒有簡單的方法可以使用mkstempstderr重定向到文件中? 存儲由mkstemp生成的文件名,以備將來在程序中使用,如果有必要?

int fd = mkstemp("pfxXXXXXX"); 
if (fd != -1) 
{ 
    //get file name here? or is there a better way 
    strcpy (errorFileName, nameFromFd); 
    freopen (errorFileName, "wt", stderr); 
} 
+2

爲什麼不讓用戶決定他想看到他的輸出的位置? –

+0

@BaummitAugen他們確定,這是隻有在指定選項時才執行的方法的一部分。無論哪種方式,這不是我的代碼。我無法做出那樣的設計決定。 – amza

+0

我的意思是,如果用戶想要,用戶可以從程序外部重定向stderr,所以不需要在代碼中執行此操作。 –

回答

3

你想看看dup2()。

dup2(fd,2); 

應該做的伎倆:

int dup2(int oldfd, int newfd); 

    dup2() makes newfd be the copy of oldfd, closing newfd first if neces- 
    sary, but note the following: 

    * If oldfd is not a valid file descriptor, then the call fails, and 
     newfd is not closed. 

    * If oldfd is a valid file descriptor, and newfd has the same value as 
     oldfd, then dup2() does nothing, and returns newfd. 

來源:男人DUP

+1

如果您顯示的文檔是引用(如格式建議),則應添加一個源,可能作爲鏈接。 –

+0

確保這是你在程序中做的第一件事。在'* FILE'和文件描述符上混合操作可能會導致奇怪的結果。 –

+0

Source是dup/dup2/dup3的手冊頁,這是在unix系統上查找C庫函數的常用方法。 「man dup2」會給你提供這些信息。 – Mirar

0

回答你問題的第二部分,存儲由mkstemp在計劃將來使用生成的文件名如果有必要,只需使用本地變量來存儲文件名

char nameBuff[32]; 
memset(nameBuff,0,sizeof(nameBuff)); 
strncpy(nameBuff,"/tmp/myTmpFile-XXXXXX",21); 
mkstemp(nameBuff); 
printf("\n Temporary file [%s] created\n", nameBuff); 
相關問題