问题标签 [streambuf]

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 回答
1106 浏览

c++ - 到 OLE IStream 的 std::ostream 接口

我有一个使用IStream的 Visual Studio 2008 C++ 应用程序。我想在std::ostream. 像这样的东西:

为此,我实现了以下代码:

是的,代码可以编译并且似乎可以工作,但是我以前没有实现过的乐趣std::streambuf。所以,我只想知道它是否正确和完整。

谢谢,保罗

0 投票
1 回答
1537 浏览

c++ - 从 std::istreambuf_iterator<> 复制到 std::vector<>

我有一个 Visual Studio 2008 C++ 应用程序,我想将流视为一组迭代器。

例如,如果我要通过流接收 WIN32_FIND_DATA 结构数组,我希望能够执行以下操作:

为此,我定义了一个派生自的类std::basic_streambuf<>

我想不通的是如何优雅地从 s 数组转到bytes 数组WIN32_FIND_DATA。因为std::basic_streambuf<>需要一个std::char_traits<>模板参数,我的印象是它只能使用内置类型,如charor byte,而不是结构如WIN32_FIND_DATA. 正确的?

关于如何使这项工作的任何建议?

谢谢,保罗

0 投票
4 回答
2943 浏览

c++ - 从 streambuf 派生而不重写相应的流

几天前,我决定编写一个streambuf可以使用mmap和预读的子类会很有趣。我查看了我的 STL (SGI) 如何实现filebuf并意识到它basic_filebuf包含一个FILE*. 所以继承自是不可能basic_filebuf的。

所以我继承自basic_streambuf. 然后我想将我的绑定mmapbuf到一个 fstream。

我认为我唯一要做的就是复制filebuf...的隐式接口,但这是一个明显的错误。在 SGI 中,basic_fstream拥有一个basic_filebuf. 无论我是否调用basic_filestream.std::::ios::rdbuf( streambuf* ),文件流都会完全忽略它并使用它自己的filebuf.

所以现在我有点困惑......当然,我可以创建自己的mmfstream,这将是精确的复制/粘贴,fstream但听起来真的不是面向 DRY。

我无法理解的是:为什么这样fstream做与 紧密耦合filebuf,以至于除了 a 之外不能使用任何东西filebuf分离流和缓冲区的全部意义在于可以使用具有不同缓冲区的流。

解决方案:

=>filestream应该依赖filebuf. 也就是说, fstream 应该由 streambuf 类模板化。这将允许每个人都可以向 a 提供自己的 streambuf 子类,fstream只要它实现了filebuf的隐式接口。问题:我们无法添加模板参数,fstream因为它会在fstream用作模板模板参数时破坏模板选择器。

=>filebuf应该是一个没有任何附加属性的纯虚拟类。这样人们就可以从它继承而不携带它所有的 FILE* 垃圾。

你对这个主题的想法?

0 投票
1 回答
2491 浏览

c++ - 如何为自定义 istream/streambuf 实现 seekg()?

十年前我曾经是一名 C++ 专家,但在过去的 10 年里,我一直在编写 Java。我刚刚开始了一个使用小型第三方 XML 解析器的 C++ 项目。XML 解析器接受 STL istream。我的 XML 数据来自 Windows COM IStream。我想我会做正确的事并创建一个适配器来获取 IStream 数据并通过 istream 将其呈现给 XML 解析器。

我按照http://www.mr-edd.co.uk/blog/beginners_guide_streambuf上的优秀教程创建了一个 COMStreambuf,它从底层 COM IStream 获取数据,并将其用作自定义 COMIstream 的缓冲区。一切看起来都不错,但我从解析器中得到一个读取错误。

结果解析器通过在 istream 上使用 seekg() 将整个文件读入内存以找出它的大小,然后使用 seekg() 回到开头一次性读取它。不出所料,前面提到的教程决定“为另一个帖子保存[实现搜索的说明]”,这显然从未写过。

有人能告诉我用我的自定义 istream/streambuf 实现 seekg() 需要做什么吗?我自己会冒险去做(我的第一个倾向是覆盖 istream 中的东西),但是由于我对 STL 的经验不够深入,加上我的 Java 心态,我担心我会做一些不完整的事情并且有一个脆弱的解决方案。(例如,如果不阅读教程,我永远不会猜到有人会通过编写新的 streambuf 来制作自定义 istream,或者我需要使用默认语言环境调用 imbue() 等)

谢谢你的帮助。这个网站给我留下了深刻的印象——参与者的知识和他们友好、诚实的天性承认谁有最好的答案。:)

0 投票
1 回答
522 浏览

c++ - 在执行 boost::asio::async_read 之后操作 streambuf 是否安全?

我知道在 async_write 工作时操纵 streambuf 是不安全的,正如 asio 作者在 boost 邮件列表中所述。我想知道的是,在 async_read 之后操作 streambuf 是否安全?

例子:

0 投票
3 回答
320 浏览

c++ - 关于streambuf溢出功能的查询

浏览溢出函数文档。我发现溢出有以下作为返回值。

返回值:

与 EOF 不同的值(或其他特征的 traits::eof() )表示成功。

如果函数失败,则返回 EOF(或其他特征的 traits::eof() )或抛出异常。

来源:“ http://www.cplusplus.com/reference/iostream/streambuf/overflow/

谁能告诉我溢出功能在哪个场景中会通过异常?任何帮助将不胜感激

0 投票
3 回答
2160 浏览

c++ - boost::asio::async_read 和 boost::asio::streambuf

我正在将 async_read 与 streambuf 一起使用。但是,我想将读取的数据量限制为 4,这样我就可以在进入正文之前正确处理标题。

如何使用 async_read 做到这一点?

0 投票
1 回答
3401 浏览

c++ - boost.asio - 设置最大读取流大小

在http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/example/http/client/async_client.cpp有示例 HTTP 客户端 请帮助我更改最大缓冲区大小,如以下代码中所述(它来自与库一起下载的示例,而不是来自站点):

这是响应缓冲区的构造函数:

但是编译器说以下代码无效:

boost::asio::streambuf response_(1024);

似乎默认缓冲区是512字节大小的,我需要更大的大小。

0 投票
4 回答
1444 浏览

c++ - 从内存映射格式化文件中读取整数

我已经映射了一个大型格式化(文本)文件,每行包含一个整数,如下所示:

所以,我在第一个字节有一个指向内存的指针,在最后一个字节也有一个指向内存的指针。我正在尝试尽快将所有这些整数读入一个数组。最初,我创建了一个专门的 std::streambuf 类来使用 std::istream 从该内存中读取,但它似乎相对较慢。

您对如何有效地将“1231232\r\n123123\r\n123\r\n1231\r\n2387897...”之类的字符串解析为数组 {1231232,123123,1231,231,2387897,. ..} ?

文件中的整数数量事先是未知的。

0 投票
3 回答
1306 浏览

c++ - 如何从内存中读取,就像使用 wistream 从文件中读取一样?

在我之前的问题中,我询问了如何从文件中读取内存。因为我的整个文件都在内存中,所以我想类似地阅读它。

我找到了问题的答案,但实际上我需要将行读为wstring. 使用文件我可以这样做:

即使文件是 ASCII 格式。

现在我只是用这个答案中的一个函数来改变我的string行。但是,我认为如果有一种方法可以像处理这块内存一样,那么将这些行设置为s 将是一个更快的解决方案。我需要这个速度很快。wstringwistreamwstring

所以有人知道如何把这块内存当作wistream?