问题标签 [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.
c++ - 刷新 boost::iostreams::zlib_compressor。如何获得“同步刷新”?
使用时是否需要一些魔法来获得“zlib 同步刷新”boost::iostreams::zlib_compressor
?只是flush
在过滤器上调用,或者strict_sync
在filtering_ostream
包含它的容器上调用它并不能完成这项工作(即,我希望压缩器足够刷新,以便解压缩器可以恢复到目前为止压缩器消耗的所有字节,而无需关闭流)。
查看header,似乎定义了一些“刷新代码”(特别是 a sync_flush
),但我不清楚它们应该如何使用(记住我的压缩器只是添加到 a 中filtering_ostream
)。
c++ - boost iostream 映射文件和 boost 进程间映射文件之间有区别吗?
我想在内存中创建一个映射的二进制文件;但是我不确定如何创建要映射到系统的文件。我多次阅读文档并意识到有 2 个映射文件实现,一个在 iostream 中,另一个在进程间。
你们对如何将映射文件创建到共享内存有任何想法吗?我试图让多线程程序读取以二进制文件格式编写的大型双精度数组。另外 iostream 和进程间映射文件有什么区别?
c++ - BOOST.IOstreams:写入 bzip2 的麻烦
您好,我想使用 Boost.IOstreams 将我的数据存储到 bzip2 文件中。
我做错了什么?我正在使用提升 1.42.0。
亲切的问候阿尔曼。
编辑 如果我删除双向选项,代码就可以工作:
也许有人可以解释为什么?
c# - boost::iostreams 中的 Zlib 压缩与 zlib.NET 不兼容
我想将我的 C# 之间的压缩数据发送到 ZLIB 格式的 C++ 应用程序。在 C++ 中,我使用 boost::iostreams 中的 zlib_compressor/zlib_decompressor。在 C# 中,我目前正在使用 zlib.NET 库中提供的 ZOutputStream。首先,当我使用两个库压缩相同的数据时,结果看起来不同:
- boost::iostreams::zlib_compressor:
63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00
- 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 中压缩的数据时,它确实有效。
有人知道出了什么问题吗?
谢谢,
约翰
c++ - 对 C++ 多态、可搜索、二进制 I/O 接口的建议
我一直在使用std::istream
andostream
作为 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 设备上放置一个薄的多态层。例如:
c++ - C++ iostreams 问题
我现在正在深入boost::iostreams
研究,我正在寻找一种方法来创建一个迭代 some 的流container<char>
。
现在我有适用于 a 的代码std::vector<char>
,但它只适用于它,因为我编写了std::vector
特定的代码。
我正在做以下事情:
其中LoadImpl(...)
描述如下:
并用于使用某些特定stream
的 .
你能给我一些关于如何让Load
日常工作更通用的建议吗?比方说,我想有能力代替std::vector<char>
它,只要有一些std::string
容器。
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
这里有一些代码:
c++ - boost::iostreams::copy() 的异常
在下面的代码中,我有一个损坏的“hello.bz2”,其中有超出 EOF 的杂散字符。
有没有办法让 boost::iostreams::copy() 调用 throw ?
编辑:请忽略迄今为止最受关注的行;EOF。请假设使用损坏的 bzip2 文件。我使用“EOF”提示我在文件上运行 bzcat 时遇到的错误
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();它已成功解压缩......所以我很困惑为什么这不起作用。
提前致谢。
-冰
c++ - 如何禁用 boost::iostreams 接收器中的缓冲区?
我使用 boost::iostreams 编写了一个“接收器”,这样当有人尝试写入 iostream 对象时,我基本上可以运行我自己的代码。
不幸的是,系统中某处有一个缓冲区,因此我的 Sink 的 write() 函数仅每 4kB 左右调用一次。这是一个问题,因为我正在实现的接收器是固定大小(例如 128 字节),因此一旦写入了这么多数据,它就需要向调用者返回错误(类似于“磁盘已满”。)
由于缓冲区的原因,调用者能够写入几千字节的数据并且没有返回错误,然后当缓冲区被刷新时,额外的数据会默默地丢失,这给我带来了问题。
有谁知道是否有可能以某种方式禁用此缓冲区?我在这里尝试了很多关于通用 iostream(例如 pubsetbuf)的建议,但它们似乎都不适用于 Boost 实现。
问题代码是我正在处理的库的一部分,如果有帮助,可以从 GitHub 获得(运行“make check”,您将看到一个由于此问题而导致的失败。)
任何建议将不胜感激!