2014-01-27 44 views
3

給出代碼如下:爲什麼遞歸中的std :: ofstream沒有按預期工作?

int recur(int num); 
int main() 
{ 
    recur(5); 
    return 0; 
}  

int recur(int num) 
{ 
    static unsigned count = 0;   
    //static 
      std::ofstream log("log.txt",std::ios_base::app|std::ios_base::out); 
    std::cout << count << "\n"; 
    log << count << "\n"; 
    ++count; 

    if (num==0) return 0; 
    num += recur(num -1); 

    return num; 
} 

輸出std::cout:中log.txt

0 
1 
2 
3 
4 
5 

內容:

5 
4 
3 
2 
1 
0 

爲什麼會像這樣?

我試圖在std::ofstream之前加上static,就像功能recur中的註釋一樣。然後它運行良好,與std::cout的輸出完全一樣。任何人都可以解釋罩下的理由嗎?

+3

當'log'被銷燬時,文本被放入文件中。它們以相反的順序銷燬。 「std :: cout」爲整個程序而生。 – chris

+4

此外,某些實現在每個'\ n'上刷新'cout',但不是文件流。在'<<'\ n''後面添加'<< std :: flush'或者使用'<< std :: endl'而不是'<<'\ n''應該恢復原來的'log'輸出序列。 – celtschk

+0

@chris你有沒有想過在'log'被銷燬之前什麼都沒有寫入文件? –

回答

2

您正在致電recur之前log已關閉它的解構器。這意味着該文件將立即被多個ofstream s打開,並且在遞歸中較早的ofstream不會像celtschk指出的那樣被刷新。如果您在致電recur之前關閉文件,它應該可以工作。如果您將log聲明爲static,它會生效,因爲然後日誌只構建一次,因此打開一次。下面的代碼添加一個塊,以確保log的解構器在recur之前被調用。

int recur(int num) 
{ 
    static unsigned count = 0; 

    { 
     std::ofstream log("log.txt",std::ios_base::app|std::ios_base::out); 
     std::cout << count << "\n"; 
     log << count << "\n"; 
     ++count; 
    } 

    if (num==0) return 0; 
    num += recur(num -1); 

    return num; 
} 
相關問題