问题标签 [boost-iostreams]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1559 浏览

c++ - 如何为读取和写入打开 boost iostream 内存映射

我是boost::iostream内存映射文件的新手,我在理解这些类时遇到了一些困难。

我希望我的函数能够创建一个新的内存映射文件用于写入和读取。我的写作部分很成功,但我不知道如何读回这些值。

阅读文档,看起来参数和类mapped_file_params::mode都被忽略了。mapped_file_sourcemapped_file_sink

可能我想使用它,因为它是我想使用的流seekgread.

如果这是不可能的,我还能使用什么?可以使用mapped_file_sink::data()回读吗?

在我的代码下面

0 投票
3 回答
4857 浏览

c++ - 使用 boost 将 gzip 压缩/解压缩到内存中

我会简短:我有这段代码:

它在这一行给出了一个错误:

错误是:

编译器会在std::back_inserter(_data)boost 的错误中一次两次地抛出这个错误。

提前致谢。

0 投票
1 回答
324 浏览

c++ - boost::iostreams::source 中的读取函数实际上是如何工作的?

我正在研究 boost::iostreams,我正在尝试编写自己的源设备。我写了两个版本的 boost::source。在第一个版本中,我只是简单地将时间字符串复制到 s 中,它就起作用了。但是在第二个版本中,我复制了一个特定的字符串,它就不行了,当我在这里下断点的时候,我发现它是一个圆圈。

这是测试。

版本 1:输出正确,版本 2:死循环。

所以我真的很困惑,“读取”调用中的工作流程是什么?

我浏览了 boost::iostreams 的手册。我发现的例子有点复杂,在我看来,这些例子所做的就是将几个成员添加到设备类中。它似乎不需要基本功能,因为我的版本 1 正在正确运行。

0 投票
1 回答
4293 浏览

c++ - 在 Windows 上使用 zlib 编译 boost

是否有关于如何在 Windows 上使用 zlib 编译 boost 的好教程。我查看了 boost 参考,但它含糊不清,还不够。我确实下载了 zlib dll 和源代码,并在 Visual Studio 中进行了参考。我有链接错误

完整代码:

我收到此错误,

错误 11 错误 LNK2019:无法解析的外部符号“_declspec(dllimport) public: __thiscall boost::iostreams::detail::gzip_header::~gzip_header(void)”(__imp??1gzip_header@detail@iostreams@boost@@QAE@XZ ) 在函数 "public: __thiscall boost::iostreams::basic_gzip_decompressor \>::~basic_gzip_decompressor >(void)" (??1?$basic_gzip_decompressor@V?$allocator@D@std@@@iostreams@boost@@ QAE@XZ) –</p>

0 投票
1 回答
2801 浏览

linux - 使用 boost::iostreams::mapped_file

我对内存映射非常陌生,并试图了解内存映射文件以在我的项目(基于 Linux)中使用它们。我的要求是写入然后从内存映射文件中读取。我写了一个示例程序,它只写并且工作正常,但我有一些非常基本的疑问,因为我不理解这个内存映射的基础。

我在这里有几个问题:

  1. 当我这样做时: mf.open(params) ,我看到在磁盘上创建了一个大小为 100 的文件。现在当我写入它时,即 *w = w1,磁盘上文件的内容发生了变化。这是否意味着我根本没有使用 RAM,而是直接写入
    磁盘?

  2. 当我执行 mf.size() 时,它总是给我作为创建实际文件的输入的大小。如何找出我实际写入
    内存映射文件的数据大小?

  3. 此外,如果我给 params.new_file_size = 10GB,该大小的文件会在
    磁盘上创建,但不会占用任何磁盘空间。使用 df cmd 确认。为什么这样?-rwx-----。1 根 10000000000 Apr 29 14:26 map.dat

  4. 我读到关闭文件释放了映射。这是否意味着关闭后我会丢失我写的所有数据?但这不是真的,因为我有工作代码,我关闭然后再次打开文件并正确读取它。

  5. 如何删除使用后创建的内存映射文件?通过使用 rm -rf cmd/linux api?

0 投票
1 回答
1089 浏览

c++ - 使用 boost::iostreams::mapped_file 时的内存使用情况

我在这里粘贴一些代码,它使用 boost iostream 来映射然后写入映射文件:

当我在具有 8 个处理器和 16GB RAM 的 centos 6 机器上执行此操作时,我观察到以下情况:

  1. 当数据被插入内存映射文件时,RES(来自 top 命令)不断增加,直到 14GB。我的印象是,当我映射文件时,VIRT 会增加而不是 RES。那么,当我们写入 mmap 文件时,是不是先将其写入内存,然后再提交到磁盘?或者是否使用了任何中间缓冲区/缓存?

  2. 在“free”命令的帮助下,我还观察到内存使用量达到 16GB 后,会使用缓冲区。以下是上述代码执行时不同时间的 free 命令的一些快照:

    这种行为意味着什么?

  3. 与写入内存相比,将数据写入内存映射文件需要花费大量时间。这是什么原因?

    在处理大量数据时,我想使用内存映射来降低 RES 的使用。但它似乎不是那样工作的。想要将所有数据保存在内存映射文件中,并在需要时将它们读回。

    我是否错误地使用了内存映射?或者这就是它的行为方式?

0 投票
1 回答
1516 浏览

c++ - 如何在 Boost::Log 中使用压缩器 Boost::Iostreams 过滤器作为接收器

我正在尝试通过使用boost::iostreams::gzip_compressor. 因此,当我调用时BOOST_LOG(),输出会即时压缩。这是我到目前为止所尝试的:

我觉得我应该以某种方式 1) 将整个 filtering_ostream 作为接收器,而不仅仅是file

2)以某种方式推动记录器接收器而不是filefiltering_ostream.

有人可以指出我正确的方向吗?谢谢!

0 投票
3 回答
1392 浏览

c++ - 为每一行调用回调的 std::ostream

我正在尝试编写一个自定义std::ostream,它为写入它的每一行调用一个函数。也就是说,我希望以下代码能够按照注释中的说明工作:

请注意,数据不会写入任何地方,也不会存储在任何地方。我需要流存储的唯一内容是正在聚合的当前行,直到我们遇到行尾。

即使使用 boost.Iostreams 库,我也没有找到任何简单的方法。我可以通过使用 STL 和 Boost 的一些内置工具来避免在这里编写自己的行标记器吗?

背景

该类my_output_stream将用于在我的应用程序中使用的外部库和日志库之间进行调整。外部库要求我提供一个 std::ostream。我想使用我的应用程序的日志框架记录外部库记录的每一行。

0 投票
1 回答
502 浏览

c++ - 读取过滤器链时如何禁用 boost::iostreams 缓冲区

我有一些看起来像这样的代码:

我已经有存储结果长度的元数据:

通过添加跟踪点,我观察到 Lz4 和 Aes 过滤器只能读取 128 个字节。此外,如果我file_source用自定义设备替换,它只能读取 4096 字节。

由于我确切地知道读取应该具有的大小,有没有办法完全禁用 iostreams 中的缓冲并将读取链接到过滤器?我知道我可以更改缓冲区大小,但我有兴趣完全禁用它们。

0 投票
1 回答
192 浏览

c++ - 使用 Boost::iostreams 两用过滤器

我试图遵循 Boost::iostreams 文档中的有限状态过滤器示例。但是当我去使用过滤器时,我收到一条错误消息,指出 ::imbue 无法访问,因为 'boost::iostreams::detail::finite_state_filter_impl' 使用 'protected' 从 'my_fsm' 继承。

沮丧的是,我将我的代码复制到了用于 boost 示例的测试中。测试编译并通过。我的结论是我可能误用了由以下定义的双重用途过滤器:

typedef io::finite_state_filter my_fsm_filter;

我觉得只是将它推到过滤流上可能不合适,但我找不到缺失的步骤。我确信必须需要包装过滤器,但我找不到任何示例(尽管我确信如果我对用于测试 boost 代码的代码进行了足够深入的研究,它必须在某个地方)。

这是一些示例代码: