问题标签 [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++ - 实现 FUSE 文件系统:iostream、FILE* 还是普通文件描述符?
我用 C++ 实现了一个小的只读 FUSE 文件系统,它从某个多文件存档中读取数据。我使用 iostreams(实际上boost::filesystem::ifstream
)来读取文件。现在我想知道这是否是一个明智的决定。
首先,iostreams 的错误消息很可怕(请参阅我的另一个问题),我不能简单地返回errno
我的文件操作引起的。但其次我想知道在实现 FUSE 文件系统时使用无缓冲 IO 是否更好(不是用于读取存档索引,而是在读取文件时 - 它是一个未压缩的存档,其中文件永远不会被拆分为多个存档文件)。因为读取文件的应用程序会根据需要进行缓冲。这种缓冲只是不必要的开销吗?
(提升)iostream 的速度有多快?好吧,我可以毫无问题地从已安装的存档中播放 WAV 文件,但我仍然想知道 iostreams 是否会在我真的不需要时增加不必要的开销(它们提供的唯一优点是它们超出范围时会自动关闭文件) .
c++ - 如何防止 iostreams::mapped_file_sink 创建可执行的 txt 文件
编辑:代码示例已损坏,缺少 .is_open(),请不要使用它。我有一个相当奇怪的问题。我使用boost iostreams,它们工作得很棒,但问题是程序创建的文件是可执行的txt文件(我在ubuntu上,msg是:“”lol2.txt“是一个可执行的文本文件。”)。那么有没有办法让它成为一个常规的不可执行文件。我想更改代码,使其不会创建可执行文件,我知道我可以在从终端或 Nautilus 创建文件后更改文件。顺便说一句,这是我正在使用的代码:
c++ - boost::iostreams 管理资源
我是 boost 及其 iostreams 包的新手,发现文档有点薄。希望有人能纠正我。我正在尝试转换我不久前编写的一小段 C# 流代码,以便在压缩流中读取。
来自文件的一部分的数据被读入内存缓冲区,该缓冲区为 zlib 解压缩器提供数据。随着时间的推移,流的消费者会选择它,当它完成时会调用Close()
which 结合垃圾收集器将清理所有资源。 注意:一个重要的区别是我不是要解压整个文件,只是其中的一小部分。该文件已被搜索到某个内部位置,并且长度相对于文件的完整大小而言很小。
我正在尝试使用 Boost 在 C++ 代码中找到与此等效的最佳方法。到目前为止,我的道德等同于上述(未经测试):
我假设我可以返回包装在 a 中的过滤shared_ptr
流,这将使消费者不必担心删除流,但我也有新的数据缓冲区。理想情况下,我希望消费者只调用close()
流,并且某些机制(例如回调)会清理过滤器中的底层资源。要求消费者将流传递给显式释放函数也是可以接受的,但我仍然不完全确定如何首先获取底层数据缓冲区。
更清洁的替代解决方案也受到欢迎。
更新 1
我尝试松散地抓住 Cat Plus Plus 关于 std::vector 支持的驱动程序的评论。这不是我所做的,但这是我迄今为止想出的。在以下代码中,我有一个 boost::shared_array-backed 驱动程序,基于 boost 驱动程序示例。
然后我有我的函数返回一个流
在我的测试程序的主要功能中:
忽略我返回的指针永远不会被释放的事实——我尽可能简单。当我运行它时会发生什么?如果我取消注释附件 A 中的代码,我会在ui
. 但是当我点击图表 B 时,我在 Boost 中深深地、深深地、深深地崩溃(有时)。好吧,废话,我超出了范围,事情就坏了,一定是一些当地人在解构并把一切都搞砸了。 data
在 shared_arrayin
中,在堆上,并且压缩器是根据文档构造的。
boost 构造函数或函数之一是否获取了对堆栈上对象的引用(即 io::stream 或 filtering_stream 的推送)?如果是这样的话,我有点回到堆上的非托管对象的问题上。
c++ - 使用带有宽字符串的 boost::iostreams::mapped_file_source
如果我用一个窄字符串实例化 mapped_file_source (boost 1.46.1 ),如下所示,我没有问题:
但是,如果我尝试使用宽字符串:
我在 VC2010 SP1 中收到以下编译器错误:
如果我尝试向构造函数传递 boost::filesystem::path ,则会收到以下错误:
我觉得我遗漏了一些明显的东西,但我只是在兜圈子,试图弄清楚编译器试图告诉我什么,但我只是迷路了。那个手掌到额头的时刻只是没有发生..我做错了什么?
mapped_file.hpp 中定义的构造函数如下所示:
basic_mapped_file_params 类构造函数如下所示:
其中模板类定义为:
标题中有一些额外的帮助,上面写着:
如果我采用这种方法:
我得到了上面提到的相同的C2664错误..
我知道编译器告诉我问题出在哪里,但是查看标头源代码和评论让我相信我想要完成的事情是受支持的,只是我的方法不正确。我是否误解了头文件告诉我的内容?我知道这里的某个地方可能有关于模板实例化和显式/隐式转换的好课。
有趣的是,将我的 boost 安装升级到 1.47.0 似乎清除了C2664错误,但我仍然收到有关访问私有成员的C2248错误。
c++ - 将 boost IOStreams 与 std::ostream_iterator 一起使用
我尝试使用基于数组设备的流并希望将流传递给std::ostream_iterator
or std::istream_iterator
,但不幸的是,使用 gcc 4.3.5 时出现编译错误。
Boost::IOStreams 文档指出,取决于底层设备类别,io::stream
它要么来自std::basic_istream
或要么来自std::basic_ostream
两者 ( )。std::basic_iostream
数组设备具有可搜索的类别,因此我希望 io::stream 派生自orstd::basic_iostream
并与之兼容。但不幸的是,我得到了一个编译错误。std::ostream_iterator
std::istream_iterator
这是代码片段:
最后一行导致错误说明:
c++ - Boost iostream:如何将 ifstream 转换为内存映射文件?
我想要的是简单地打开文件以读取内存映射文件 - 以便将来以更快的速度访问它(例如:我们打开文件读取它以结束,等待并一次又一次地读取它)同时我想要那个文件可以被其他程序修改,当他们修改它时,我希望我的 ifstream 也修改。如何使用 boost iostreams(或 boost 进程间)做这样的事情?我们可以只做高操作系统吗?嘿,这个文件应该是所有应用程序的内存映射吗?
所以我尝试这样的代码:
因此它打开或创建文件,将其放入 ram。但我无法从任何其他程序访问它(我无法编辑和保存,但我可以打开)=(如何使文件可从其他程序编辑?
c++ - 如何在 Windows 上使用 gzip 和 bzip2 支持构建 boost iostreams
我如何建立和支持boost
的iostreams
图书馆?gzip
bzip2
c++ - boost::iostream::filtering_streambuf 的编译错误
只是想用 bzip2 压缩一个字符串,这样我就可以用 ReadFile 通过管道发送它。
以下行给我带来了以下编译错误。
in.push(uncompressed_string);
错误 6 错误 C2027:使用未定义类型 'boost::STATIC_ASSERTION_FAILURE' c:\program files (x86)\boost\boost_1_47\boost\iostreams\chain.hpp 488 1 Agent
c++ - 文件 i/o 乱码
这两个函数之间的数据正在变得乱码。检查每一侧的变量表明数据肯定是不同的。消息大小信号确实有效。这是有问题的第二个读/写函数。这是我的写入功能及其计数器读取功能:
c++ - 如何直接使用 boost::iostreams 过滤器
如何使用 boost::iostreams::gzip_decompressor 解压缩 boost::asio::streambuf 序列?
这是我的想法(非工作伪代码):
无法更改 sinkData 和 flush 函数。多次调用 sinkdata(),然后调用一次 flush()。
boost::iostreams::gzip_decompressor 是用于此目的的最佳库吗,如果是,该怎么做?否则,还能有什么建议?