样品:

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()的方式有两个问题,除了一般的评论,它是完全可选的。

  • readsome()的目的是从上次调用rdbuf()->underflow()时已经从字符源提取到流的内部缓冲区的数据中获取下n个字节。构造流时,它不会(在这种情况下)尝试立即从源中读取数据,它的缓冲区为空。 readsome()没什么让您满意的。

    编辑:从技术上讲,在这种情况下,它回落到showmanyc()(也是完全可选的),以找出数据源中有多少数据可用,但是在此实现中,showmanyc碰巧返回“不确定”(零)。
  • 即使您通过常规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对此很聪明,当我读取第一个char时,它使streambuffer的内部指针直接指向数组,因此在这种情况下,可以从readsome()获取所有要读取的内容。

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

    10-08 08:24