如何从std :: ofstream类派生,在写入文件之前添加一些动作? 换句话说,替换像
这样的代码int main()
{
std::ofstream file("file.txt");
file << "something" << std::endl;
return 0;
}
通过
class MyFile : public std::ofstream
{
MyFile(std::string filename) : std::ofstream(filename) {}
??? operator<< ??? <-- HERE1
{
// 1. do some stuff with the input
// 2. if wanted,
// flush it to the base class operator<<
}
};
class MyFileC
{
private:
std::ofstream intern_os;
public:
MyFileC(std::string filename) : intern_os(filename) {}
MyFileC& operator<<( input ??? <-- HERE2 )
{
// 1. do some stuff with the input
// e.g (a) IF the input is a std::string,
// THEN, if it contains "signal",
// OnSignal();
// or (b) if file size is too big, clear it ...
// 2. Flush it (for all possible types):
intern_os << input;
}
};
int main()
{
MyFile file("file2.txt"); // (or with MyFileC)
file << "something" << std::endl;
return 0;
}
我们可以在写作之前进行即时过滤等。
在 ??? 行中放入什么来享受所有现有的std :: ofstream.operator&lt;&lt;(),请加上我们的个人添加内容?
答案 0 :(得分:1)
operator<<
不打算被派生的流类覆盖。相反,您应该覆盖std::basic_streambuf::overflow
和/或std::basic_streambuf::xsputn
。
overflow
。如果要提供自己的缓冲,可以通过在重写的流类中通过std::basic_streambuf::setp
初始化流指针来完成此操作。链接附带了如何执行此操作的示例。
这里只有一个美容问题:这些都是缓冲区方法。您要覆盖std::fstream
,这是流类,而不是buffer class。因此,您需要做的是双重的:
std::basic_filebuf
。std::fstream::rdbuf
将文件流对象的关联缓冲区设置为已覆盖的文件缓冲区类的实例。您可以在现有std::fstream
的实例上或在该类型的自定义子类上执行此操作。