2014-12-04 50 views
-1
#include<stdio.h> 
#define DEBUG 
int main() 
{ 
    #ifdef DEBUG 
    freopen("ddd.txt","a",stdout); 
    freopen("ddd.txt","a",stderr); 
    #endif 
    printf("1\n"); 
    perror("2"); 
    printf("3\n"); 
    perror("4"); 
    printf("5\n"); 
    perror("6"); 
} 

由於@JonathanLeffler筆記執行,在Mac OS X 10.10.1與GCC 4.9.1這給:計劃在陌生的順序

2: Undefined error: 0 
4: Undefined error: 0 
6: Undefined error: 0 
1 
3 
5 

爲什麼奇怪的順序?

此外,perror返回「無效參數」作爲錯誤。在同一個文件上使用freopen安全嗎?

+3

你在這裏有什麼問題? – Kelm 2014-12-04 06:41:52

+0

猜測問題的格式錯誤,他需要知道的是「在同一個文件上使用freopen安全嗎?」 – cwap 2014-12-04 06:43:11

+0

請在您的問題中包含所有信息,*包括您想要解釋的輸出*。答疑者不應該對你的問題進行逆向工程。 :-) – HostileFork 2014-12-04 14:20:04

回答

2

我得到的Mac OS X 10.10.1與GCC 4.9.1輸出是:

2: Undefined error: 0 
4: Undefined error: 0 
6: Undefined error: 0 
1 
3 
5 

的順序是這樣的,因爲沒有經過緩衝標準錯誤和標準輸出進行緩衝。

可能有多種原因導致錯誤EINVAL,無效參數。除非freopen()返回錯誤指示,否則您沒有理由檢查errno中的值;即使它們成功,庫函數也可以設置爲errno。 (例如,在Solaris上,許多輸出操作會將errno設置爲ENOTTY,而不是tty,即使操作成功,輸出爲除終端以外的其他設備。)

請注意,您應嚴格,請在使用流之前檢查freopen()返回的值是否爲NULL。如果文件不能創建或無法寫入或者是一個目錄,呼叫可能會失敗等

,並解決你的問題:

是否安全,在同一文件中使用freopen函數?

這取決於您對「安全」的定義。你的電腦會爆炸嗎?不,不僅僅是因爲這個。 freopen()將在第二次嘗試失敗嗎?不,它沒有。你可以用數據獲得有趣的交錯效果嗎?是的,當然了。標準輸出塊(不一定以換行符結束)可以很容易地與標準錯誤行交錯。你會經常這樣做嗎?不,你不會經常這樣做。如果這樣做,則可能需要在撥打freopen()後立即將setvbuf()的標準輸出和標準錯誤設置爲緩衝行緩衝。這會減少奇數輸出的數量。