2016-05-31 64 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的析构函数中调用的。你不应该在正常使用情况下直接调用它。