c++ - boost::iostreams::stream<boost::iostreams::array_source> 不设置 EOF

标签 c++ boost boost-iostreams

示例:

namespace  boostio = boost::iostreams;
boostio::stream<boostio::array_source> memStream(arr);


while (!memStream.eof())
{
    char tst[2];

    memStream2.readsome(tst, 2);
}

这里我使用 char 数组初始化 memstream,但 while 循环永远不会结束。有什么问题吗?

编辑:使用流的读取方法可以按预期工作。使用其他任何东西(包括运算符>>)都是不行的

最佳答案

除了一般评论说它是完全可选的之外,按照您的方式使用 readsome() 还存在两个问题。

  1. readsome() 的目的是从上次调用 时已从字符源拉入流的内部缓冲区的任何数据中获取接下来的 n 个字节rdbuf()->下溢()。当构造流时,它不会(在这种情况下)尝试立即从源读取,它的缓冲区是空的。 readsome() 对你没有任何帮助。

    编辑:从技术上讲,在这种情况下,它会回退到(也是完全可选的)showmanyc(),以找出数据源中有多少可用数据,但在此实现中 showmanyc 恰好返回“不确定”(零)。

  2. 即使您填充流缓冲区(通过常规 read() 或 get() 等),readsome 在到达流缓冲区末尾时也不会设置任何流标志:它不知道源中是否有更多可用数据(因为 showmanyc() 无法说明)。

以下内容适用于我的测试:

#include <iostream>
#include <complex>
#include <iomanip>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/array.hpp>

int main()
{
    namespace  boostio = boost::iostreams;

    char arr[10] = "example";
    boostio::stream<boostio::array_source> memStream(arr);

    char c;
    while(memStream.get(c)) // prime the buffer by reading 1 char
    {
        std::cout << c;
        char tst[2];
        while(memStream.readsome(tst, 2) > 0) // read some more
            for(int n = 0; n < memStream.gcount(); ++n)
                std::cout << tst[n];
    }
    std::cout << '\n';
}

仔细一看,iostreams对此很聪明,当我读取第一个字符时,它使streambuffer的内部指针直接指向数组,因此剩下要读取的所有内容都可以从readsome()中获取本案。

现在,对于运算符>>,memStream >> setw(2) >> tst;对我来说非常好(我希望你在数组上使用>>时记得setw! ),尽管使用了错误的循环条件“while(!stream.eof())`。您需要提供一个测试用例来演示您在使用运算符时遇到的问题>>

关于c++ - boost::iostreams::stream<boost::iostreams::array_source> 不设置 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13727296/

相关文章:

c++ - 创建一个 "mountable"文件系统,从哪里开始?

c++ - boost 库是否依赖于 std C++ 库?

c++ - 为什么 boost::hana 的集合不能默认构造?

c++ - 带有 vector 的 shared_ptr

c++ - 使用 boost iostreams 过滤器(关闭且不可复制)

当涉及 std::function 或 lambda 函数时,C++11 不推导类型

c++ - 从类调用函数时箭头 '->' 分隔符崩溃

c++ - 获取成员变量值设置然后传递给函数c++

c++ - boost::iostream::filtering_streambuf 的编译错误

c++ - 使用 BOOST property_tree/iostreams/filesystem/foreach - 结果出现链接错误