【发布时间】:2012-07-14 15:17:09
【问题描述】:
我想创建一个iostream 适配器类,它可以让我即时修改写入流或从流中读取的数据。
适配器本身应该是 iostream 以允许对第三方代码真正透明。
从std::ostream 派生的StreamEncoder 类的示例:
// External algorithm, creates large amounts of log data
int foo(int bar, std::ostream& logOutput);
int main()
{
// The target file
std::ofstream file("logfile.lzma");
// A StreamEncoder compressing the output via LZMA
StreamEncoder lzmaEncoder(file, &encodeLzma);
// A StreamEncoder converting the UTF-8 log data to UTF-16
StreamEncoder utf16Encoder(lzmaEncoder, &utf8ToUtf16);
// Call foo(), but write the log data to an LZMA-compressed UTF-16 file
cout << foo(42, utf16Encoder);
}
据我所知,我需要创建一个新的 basic_streambuf 派生类并将其嵌入到 basic_ostream 子类中,但这似乎相当复杂。
有没有更简单的方法可以做到这一点?
【问题讨论】:
-
看来你应该学习流操纵器的概念。搜索它,这里有一个例子stackoverflow.com/questions/799599/…或这里stackoverflow.com/questions/535444/…
-
您看过boost iostreams 库吗?这已经有了压缩过滤器(虽然没有 lzma AFAIK)和使编写自定义过滤器更简单的机制。
-
正确的做法是写一个自定义的
streambuf。这确实不是一项复杂的任务。真正唯一的困难是找到描述需要做什么的参考资料。