std::fstream 对象是否应定义为 class 成员

Should std::fstream object be defined as class member

应该将 fstream 定义为 class 成员还是在每个函数中定义它? 我知道这两种方法都有效,但更好的方法是什么?我要实现读取、写入、修改、删除这个单个文件的功能。

我的目标是编写干净、可移植的代码。

将 std::fstream 显示为 class 成员的第一个示例:

#include <fstream>

class File {
public:
    bool File::write(const std::string & str) {
        fileStream.open(name, std::fstream::out | std::fstream::app | std::fstream::binary);
        bool openSuccess = fileStream.is_open();
        if(openSuccess ){
            fileStream << str;
            closeFile();
        }
        return openSuccess;
    }
//  bool read();
private:
    std::fstream fileStream;
}

如果第一个示例中的代码是正确的,也许我应该定义单独的 std::ifstream、std::ofstream.

显示函数中定义的 std::fstream 的另一个示例:

class File {
public:
    bool File::write(const std::string & str) {
        std::fstream fileStream(name, std::fstream::out | std::fstream::app | std::fstream::binary);
        bool openSuccess = fileStream.is_open();
        if(openSuccess ){
            fileStream << str;
            closeFile();
        }
        return openSuccess;
    }
//  bool read();
}

第二种方法使用起来可能更安全,因为每次函数退出时,流对象都会被销毁。但恐怕每次多次调用对象构造都会产生巨大的覆盖。同样,速度不是我的首要任务,但它仍然是 C++,所以我不想牺牲太多效率。

您可以将 class 成员视为对象的 state

在您的示例中,fileStream 在调用 File::write() 之间不执行任何操作,因此它不包含 state.

如果您有多个 class 方法写入(或读取)同一个 fileStream,将其作为成员变量并提供 openclose 方法与 write.

分开

在我看来,使用std::fstream的可能性太广了。

  • 您可以通过在构造函数中打开文件并依靠析构函数关闭它来将其用作 RAII 对象。如果你采用这种方法,你应该相应地匹配对象的生命周期。例如,如果您有打开、修改和关闭文件的方法,则使用 std::fstream 作为本地对象。如果您需要一个文件在某个对象的整个生命周期内保持打开状态,请使用 std::fstream 作为其 class 字段。

  • 此外,您可以使用 std::fstreamopenclose 方法 open/close/reopen 文件。它使事情变得更加复杂。 std::fstream 对象可以重复用于处理一个或多个文件。例如,通过拥有一个全局 std::fstream 对象,您可以相应地处理多个文件。