我正在尝试实现类似于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
参数的选项?这样,我的输入文件句柄将仅处理输入操作,而输出版本将仅处理输出操作。
答案 0 :(得分:0)
在什么情况下将
ifstream
用于输出操作,类似地,何时将ofstream
用于输入操作
如果您仍想使用内部std::ios_base::in
对象执行这些关联的操作,则可以使用std::filebuf
开放模式打开输出文件流,反之亦然,您可以使用内部stream->rdbuf()
对象执行这些关联的操作由std::ofstream
。请注意,即使std::ifstream
和int 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