带有文件流的 RAII
RAII with a filestream
在c++语言中,打开和操作文件的方式有很多种。然而,RAII 方法非常流行,因为析构函数负责释放内存。
但是文件流的关闭呢?据我所知,析构程序无论如何都应该关闭文件。然而,析构函数也不允许抛出任何异常。因此,如果我不关闭我的流并且它在一个块的末尾被破坏,我可能会丢失有关错误的信息,这可能在关闭时发生。
我的想法对吗?尽管有 RAII 方法,我应该始终关闭我的流?
示例:
{
std::ofstream ofs;
ofs.open ("test.txt");
ofs << "blablabla";
//do i need the following?
ofs.close();
}
您应该让 fstream
析构函数关闭文件。
如您所说,析构函数不会抛出,因此您永远不会看到关闭文件时发生的任何错误,但是 std::basic_fstream::close()
成员函数有一个 void
return 类型,这样也不会发出错误信号。别担心这个;只允许析构函数像任何其他 RAII class.
一样关闭文件
注意,buffer that underlies the fstream
has a close()
成员函数也是。此函数 returns NULL
如果出现错误,或 this
指针成功。此函数从 basic_filebuf
的析构函数中调用,后者又从 basic_fstream
的析构函数中调用。正常使用不应该直接调用这个。
答案取决于您是否要在关闭时对错误做出反应。
如果你想做出反应,你必须手动close
并检查错误情况(关闭失败将设置failbit
):
std::ofstream str;
// Do something
str.close();
if (str.fail()) {
// react on error
}
如果你不想做出反应,何必呢?就让析构函数关闭文件
在c++语言中,打开和操作文件的方式有很多种。然而,RAII 方法非常流行,因为析构函数负责释放内存。
但是文件流的关闭呢?据我所知,析构程序无论如何都应该关闭文件。然而,析构函数也不允许抛出任何异常。因此,如果我不关闭我的流并且它在一个块的末尾被破坏,我可能会丢失有关错误的信息,这可能在关闭时发生。
我的想法对吗?尽管有 RAII 方法,我应该始终关闭我的流?
示例:
{
std::ofstream ofs;
ofs.open ("test.txt");
ofs << "blablabla";
//do i need the following?
ofs.close();
}
您应该让 fstream
析构函数关闭文件。
如您所说,析构函数不会抛出,因此您永远不会看到关闭文件时发生的任何错误,但是 std::basic_fstream::close()
成员函数有一个 void
return 类型,这样也不会发出错误信号。别担心这个;只允许析构函数像任何其他 RAII class.
注意,buffer that underlies the fstream
has a close()
成员函数也是。此函数 returns NULL
如果出现错误,或 this
指针成功。此函数从 basic_filebuf
的析构函数中调用,后者又从 basic_fstream
的析构函数中调用。正常使用不应该直接调用这个。
答案取决于您是否要在关闭时对错误做出反应。
如果你想做出反应,你必须手动close
并检查错误情况(关闭失败将设置failbit
):
std::ofstream str;
// Do something
str.close();
if (str.fail()) {
// react on error
}
如果你不想做出反应,何必呢?就让析构函数关闭文件