- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想创建一个 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
子类中,但这似乎相当复杂。
有没有更简单的方法来完成这个?
最佳答案
奇怪的是,至少当事情真的打算工作时,这些都不应该直接涉及 iostreams 和/或 streambufs。
我会将 iostream 视为媒人类。 iostream 有一个 streambuf,它为某种外部数据源/接收器提供缓冲接口(interface)。它还具有处理所有格式的语言环境。 iostream 只不过是让这两者很好地一起玩(可以这么说)的 playground supervisor。由于您正在处理数据格式化,因此所有这些都(或应该)在语言环境中处理。
尽管语言环境不是单一的——它由许多 facet
组成,每个 facet 专门用于数据格式化的一个特定部分。在这种情况下,您可能关心的部分是 codecvt
方面,它(几乎专门)用于在从 iostream 读取/写入数据的外部和内部表示之间进行转换。
然而,无论好坏,一个语言环境一次只能包含一个 codecvt facet,而不是像您正在考虑的那样包含它们的链。因此,您真正需要/想要的是一个包装类,它提供一个 codecvt 作为其外部接口(interface),但允许您在 I/O 期间链接一些要对数据完成的任意转换集。
对于 utf 到 utf 的转换,Boost.locale 提供了一个 utf_to_utf 函数和 codecvt 包装器代码,因此这部分转换简单明了。
为了避免有人建议用 ICU 来完成这些事情,我要补充一点,Boost.Locale 几乎是 ICU 的包装器,所以这或多或少是相同的答案,但形式对 C++ 更友好(而 ICU 本身更像 Java,并且几乎完全敌视 C++)。
事情的另一面是编写 codecvt facet 给一个相当简单的任务增加了大量的复杂性。过滤 streambuf(例如)通常很多编写起来更简单。它仍然没有您想要的那么容易,但也没有 codecvt 方面那么糟糕。正如@Flexo 已经提到的,Boost iostreams 库已经包含一个过滤 streambuf,它可以进行 zip 压缩。使用 lzma(或 lzh、算术等压缩)做大致相同的事情相对容易,至少假设你有易于使用的压缩函数(你基本上只是为它们提供输入缓冲区,并且它们提供缓冲区结果)。
关于c++ - 创建 std::iostream 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11493063/
在 C++ 中包含头文件时,和...有什么区别 在 <> 标志中包含 .h 部分与不包括 .h 部分? #include 与 #include 将标题名称用双引号括起来还是用 符号括起来? #inc
最近我在阅读 Accelerated C++ 并从练习答案中发现了这个有趣的代码。这是完整的代码, #include "stdafx.h" #include "4_4.h" #include usi
我正在开发一个需要能够在标准 C++ 编译器和准标准编译器上编译的实用程序。代码可以而且将会被扔到几乎任何现有的 C++ 编译器上。 我正在寻找一种可靠且可移植地确定目标编译器是否支持带或不带 .h
如果有一个文件 foo.cpp,那么它通常有一个关联的头文件 foo.h,其中包含 foo.cpp 中定义的函数的所有声明。这样,所有其他使用 foo.cpp 中的函数的文件都可以只包含 foo.h
iostream 和 iostream.h 有什么区别? 最佳答案 iostream.h 已被提供它的编译器弃用,iostream 是 C++ 标准的一部分。 为了明确说明,当前 C++ 标准 (IN
我知道关于 之间的区别的问题和 之前有人问过。阅读这些答案后,我发现了以下差异 当然iostream.h已弃用,新的符合标准的编译器不支持它 iostream.h不包含 std 中的所有内容命名
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Difference between iostream and iostream.h 我的教授说了以下内容:
我需要构建一些我在办公室电脑上得到的旧代码,它有 gcc 4.4.5安装。我编辑了代码(删除 .h 或添加类似 的内容)以使它们保持最新,以便它们可以由 gcc 4.4.5 编译.但是,在看似成功编
我在学习C++的时候遇到了一个问题,在编译的时候遇到了错误。 详情如下: 最佳答案 您似乎没有在 MinGW 中安装 C++ 支持。如果您使用手动安装路径,请下载 gcc-c++ dev、dll 和
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: What is the difference between #include and #include
对于我当前的任务,我需要能够读/写(主要是基于文件的)比特流。虽然如果用标准 C/C++ 编码,这或多或少是一项微不足道的任务,但我喜欢通过重载和使用更通用的方法重写代码标准的 STL iostrea
这个问题在这里已经有了答案: Difference between iostream and iostream.h (3 个答案) 关闭 9 年前。 有什么区别 #include 和 #inclu
我正在尝试为 linux/MacOS 转换一个用 C++14 编写的应用程序。它使用 boost::filesystem,但不用于某些 iostream 操作。例如: boost::filesyste
示例: namespace boostio = boost::iostreams; boostio::stream memStream(arr); while (!memStream.eof())
我编写了以下简单的 C++ 程序: #include using namespace std; int main() { cout ^~~~~~~~~~ 1 error
我想在我的代码中将流公开为它们的标准等价物,以消除用户对 boost::iostreams 的依赖性.如果有必要,当然想有效地执行此操作而无需创建拷贝。我考虑过只设置 std::istream的缓冲区
#include in header files and #include only in cpp files 被认为是最佳实践。我正在尝试将大量 #include 从 header 移动到现有
#include #include #include #include using namespace std; int main() { int ival; while(ci
假设我得到一个 stringbuf,其中包含一些必须删除的特定字符序列的内容: std::stringbuf string_buff; std::iostream io_stream (&string
我有一个包含如下记录的文件 123 Tag 现在是所有好人都来帮忙的时候了 总是有一个数字和一些标签,后面跟着一系列单词。我想将数字提取为整数,将标记提取为字符串,将句子提取为字符串。我已经使用 ge
我是一名优秀的程序员,十分优秀!