C ++文件句柄

时间:2019-07-08 01:57:40

标签: c++ file-io

我正在尝试实现类似于Bjarne Stroustrup的“常见问题”页面中的文件句柄类。 (滚动到"Why doesn't C++ provide a 'finally' construct"。)但是,与他的示例不同,我想使用C ++文件流而不是FILE*

现在,我正在考虑创建一个FileHandleBase类或类似的名称,以及两个派生类-一个用于输入文件,一个用于输出文件。下面是我作为概念证明编写的实现;请记住,它非常简单且未完成。

class FileHandle {
public:
    FileHandle(const char* fn, ios_base::openmode mode = ios_base::in | ios_base::out) {
        file.open(fn, mode);
        // Check to make sure file is open
    }
    FileHandle(const string &fn, ios_base::openmode mode = ios_base::in | ios_base::out) {
        file.open(fn, mode);
        // Check to make sure file is open
    }
    ~FileHandle() {
        file.close();
    }
private:
    fstream file;
};

我想知道这是否是制作文件句柄的可行方法,也就是说,我的继承思想是否很好。我还想知道处理ios_base::openmode参数的最佳方法,因为std::ifstream的C ++参考页说:

  

请注意,即使stream是输入流,也可以将其内部filebuf对象设置为也支持输出操作。

在什么情况下将ifstream用于输出操作,类似地,何时将of stream用于输入操作;是否应该限制文件句柄类的ios_base::openmode参数的选项?这样,我的输入文件句柄将仅处理输入操作,而输出版本将仅处理输出操作。

1 个答案:

答案 0 :(得分:0)

  

在什么情况下将ifstream用于输出操作,类似地,何时将ofstream用于输入操作

如果您仍想使用内部std::ios_base::in对象执行这些关联的操作,则可以使用std::filebuf开放模式打开输出文件流,反之亦然,您可以使用内部stream->rdbuf()对象执行这些关联的操作由std::ofstream。请注意,即使std::ifstreamint main() { std::ofstream stream("test.txt"); stream << "Hello" << std::flush; stream.close(); stream.open("test.txt", std::ios_base::in); char buffer[SIZE] = {}; stream.rdbuf()->sgetn(buffer, SIZE); std::cout << buffer << std::endl; } 流仍然可以分别执行输出和输入,即使它们以相反的打开方式打开。

Comment