2016-05-31 62 views
2

在C++語言中,如何在文件上打開和操作有多種方式。然而,RAII方法非常受歡迎,因爲摧毀者注意釋放內存。帶文件流的RAII

但是關閉文件流呢?據我所知,無論如何,破壞者應該關閉文件。但是,破壞者也不允許拋出任何例外。所以,如果我不關閉我的流,並且它在塊的末尾被破壞,我可能會丟失有關錯誤的信息,這可能會在關閉時發生。

我的想法是否正確?儘管RAII方法我應該總是關閉我的流?

例子:

{ 
    std::ofstream ofs; 
    ofs.open ("test.txt"); 

    ofs << "blablabla"; 

    //do i need the following? 
    ofs.close(); 
} 
+0

當文件流對象被包含在其中時,文件流對象應該被銷燬(並因此關閉,但不會拋出異常)。不需要在析構函數中顯式關閉文件。 –

+0

不,你不需要手動'.close()',這是RAII的_whole point_。 – emlai

回答

3

答案取決於您是否想在關閉時對錯誤做出反應。

如果你想做出反應,你必須手動close並檢查錯誤條件(沒有閉合將設置failbit):

std::ofstream str; 
// Do something 
str.close(); 
if (str.fail()) { 
    // react on error 
} 

如果你不想做出反應,何必呢?只要讓析構函數關閉文件

3

你應該讓fstream析構函數關閉文件。

正如你所說的,析構函數不會拋出,所以在關閉文件時你永遠不會看到任何錯誤,但std::basic_fstream::close()成員函數的void返回類型,所以不會發出錯誤信號。不要擔心這個;只要允許析構函數關閉任何其他RAII類的文件即可。


注意,構成了這一fstreambufferclose()成員函數了。如果出現錯誤,此函數返回NULL,或成功返回this指針。這個函數是從basic_filebuf的析構函數調用的,而這個函數又是從basic_fstream的析構函數中調用的。你不應該在正常使用情況下直接調用它。