问题标签 [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 投票
2 回答
2372 浏览

c++ - 刷新 boost::iostreams::zlib_compressor。如何获得“同步刷新”?

使用时是否需要一些魔法来获得“zlib 同步刷新”boost::iostreams::zlib_compressor?只是flush在过滤器上调用,或者strict_syncfiltering_ostream包含它的容器上调用它并不能完成这项工作(即,我希望压缩器足够刷新,以便解压缩器可以恢复到目前为止压缩器消耗的所有字节,而无需关闭流)。

查看header,似乎定义了一些“刷新代码”(特别是 a sync_flush),但我不清楚它们应该如何使用(记住我的压缩器只是添加到 a 中filtering_ostream)。

0 投票
2 回答
2607 浏览

c++ - boost iostream 映射文件和 boost 进程间映射文件之间有区别吗?

我想在内存中创建一个映射的二进制文件;但是我不确定如何创建要映射到系统的文件。我多次阅读文档并意识到有 2 个映射文件实现,一个在 iostream 中,另一个在进程间。

你们对如何将映射文件创建到共享内存有任何想法吗?我试图让多线程程序读取以二进制文件格式编写的大型双精度数组。另外 iostream 和进程间映射文件有什么区别?

0 投票
1 回答
2073 浏览

c++ - BOOST.IOstreams:写入 bzip2 的麻烦

您好,我想使用 Boost.IOstreams 将我的数据存储到 bzip2 文件中。

我做错了什么?我正在使用提升 1.42.0。

亲切的问候阿尔曼。

编辑 如果我删除双向选项,代码就可以工作:

也许有人可以解释为什么?

0 投票
1 回答
1193 浏览

c# - boost::iostreams 中的 Zlib 压缩与 zlib.NET 不兼容

我想将我的 C# 之间的压缩数据发送到 ZLIB 格式的 C++ 应用程序。在 C++ 中,我使用 boost::iostreams 中的 zlib_compressor/zlib_decompressor。在 C# 中,我目前正在使用 zlib.NET 库中提供的 ZOutputStream。首先,当我使用两个库压缩相同的数据时,结果看起来不同:

  1. boost::iostreams::zlib_compressor:

63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00

  1. zlib.NET (zlib.ZOutputStream):

78 9C 63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00 4F 31 63 8D

(注意 zlib.NET 中存在的 78 9C 模式,但 boost 中没有)。

此外,当我解压缩在 zlib.NET 中压缩的 boost 中的数据时,我无法从流中读取数据,提示有问题。当我尝试解压缩在 boost 中压缩的数据时,它确实有效。

有人知道出了什么问题吗?

谢谢,

约翰

0 投票
2 回答
687 浏览

c++ - 对 C++ 多态、可搜索、二进制 I/O 接口的建议

我一直在使用std::istreamandostream作为 C++ 中随机访问二进制 I/O 的多态接口,但它在许多方面似乎都不是最理想的:

  • 由于 streampos/streamoff 的限制,64 位搜索是不可移植的并且容易出错;目前使用boost/iostreams/positioning.hpp作为解决方法,但需要警惕
  • 缺少诸如截断或扩展文件的操作(ala POSIX ftruncate
  • 具体实现之间的不一致;例如stringstream具有独立的获取/放置位置,而filestream没有
  • 平台实现之间的不一致;例如,寻求通过文件末尾的行为或在错误时使用failbit/badbit
  • 不需要所有的格式化工具,stream甚至可能不需要缓冲streambuf
  • streambuf错误报告(即异常与返回错误指示符)在实践中被认为是依赖于实现的

我喜欢Boost.Iostreams Device 概念提供的简化接口,但它是作为函数模板而不是多态类提供的。(有一个device,但它不是多态的,只是提供的设备实现不一定使用的实现助手类。)我主要使用大型磁盘文件,但我真的想要多态,所以我可以轻松替换替代实现(例如使用stringstream而不是fstream用于单元测试)没有深度模板实例化的所有复杂性和编译时耦合。

有没有人对此有任何标准方法的建议?这似乎是一种常见的情况,所以我不想不必要地发明自己的接口。例如,像 java.nio.FileChannel 这样的东西似乎很理想。

到目前为止,我最好的解决方案是在 Boost.Iostreams 设备上放置一个薄的多态层。例如:

0 投票
3 回答
464 浏览

c++ - C++ iostreams 问题

我现在正在深入boost::iostreams研究,我正在寻找一种方法来创建一个迭代 some 的流container<char>

现在我有适用于 a 的代码std::vector<char>,但它只适用于它,因为我编写了std::vector特定的代码。

我正在做以下事情:

其中LoadImpl(...)描述如下:

并用于使用某些特定stream的 .

你能给我一些关于如何让Load日常工作更通用的建议吗?比方说,我想有能力代替std::vector<char>它,只要有一些std::string容器。

0 投票
1 回答
2060 浏览

c++ - 如何让 boost::iostream 在与 std::ios::binary 相当的模式下运行?

我有以下问题boost::iostreams。如果有人熟悉编写过滤器,我真的很感谢您的建议/帮助。

我正在编写一对多字符过滤器,boost::iostream::filtering_stream可用作数据压缩器和解压缩器。 我从写一个压缩器开始,从 lz-family 学习了一些算法,现在正在研究一个解压缩器。

简而言之,我的压缩器将数据拆分为数据包,这些数据包分别编码,然后刷新到我的文件中。

当我必须从我的文件中恢复数据时(在编程术语中,接收read(byte_count)请求),我必须读取一个完整的打包块,缓冲它,解包它,然后才给出请求的字节数。我已经实现了这个逻辑,但现在我正在努力解决以下问题:


当我的数据被打包时,任何符号都可以出现在输出文件中。而且我在读取文件时遇到麻烦,其中包含(hex 1A, char 26)使用boost::iostreams::read(...., size).

例如,如果我使用std::ifstream,我会设置一个std::ios::binary模式,然后可以简单地读取这个符号。

在实现使用例程读取字符序列的boost::iostream过滤器时,有什么方法可以实现相同的效果?boost::iostream::read


这里有一些代码:

0 投票
2 回答
2711 浏览

c++ - boost::iostreams::copy() 的异常

在下面的代码中,我有一个损坏的“hello.bz2”,其中有超出 EOF 的杂散字符。

有没有办法让 boost::iostreams::copy() 调用 throw ?

编辑:请忽略迄今为止最受关注的行;EOF。请假设使用损坏的 bzip2 文件。我使用“EOF”提示我在文件上运行 bzcat 时遇到的错误

0 投票
3 回答
2067 浏览

c++ - boost::iostreams::zlib::default_noheader 似乎被忽略了

我无法让 boost::iostreams 的 zlib 过滤器忽略 gzip 标头...似乎将 zlib_param 的 default_noheader 设置为 true 然后调用 zlib_decompressor() 会产生“data_error”错误(标头检查不正确)。这告诉我 zlib 仍然期待找到标头。有没有人得到 boost::iostreams::zlib 来解压缩没有标题的数据?我需要能够读取和解压缩没有两字节标头的文件/流。任何帮助将不胜感激。

这是 boost::iostreams::zlib 文档提供的示例程序的修改版本:

我知道我的测试数据还不错;我写了一个小程序在测试文件上调用gzread();它已成功解压缩......所以我很困惑为什么这不起作用。

提前致谢。

-冰

0 投票
1 回答
547 浏览

c++ - 如何禁用 boost::iostreams 接收器中的缓冲区?

我使用 boost::iostreams 编写了一个“接收器”,这样当有人尝试写入 iostream 对象时,我基本上可以运行我自己的代码。

不幸的是,系统中某处有一个缓冲区,因此我的 Sink 的 write() 函数仅每 4kB 左右调用一次。这是一个问题,因为我正在实现的接收器是固定大小(例如 128 字节),因此一旦写入了这么多数据,它就需要向调用者返回错误(类似于“磁盘已满”。)

由于缓冲区的原因,调用者能够写入几千字节的数据并且没有返回错误,然后当缓冲区被刷新时,额外的数据会默默地丢失,这给我带来了问题。

有谁知道是否有可能以某种方式禁用此缓冲区?我在这里尝试了很多关于通用 iostream(例如 pubsetbuf)的建议,但它们似乎都不适用于 Boost 实现。

问题代码是我正在处理的库的一部分,如果有帮助,可以从 GitHub 获得(运行“make check”,您将看到一个由于此问题而导致的失败。)

任何建议将不胜感激!