boost :: iostreams :: stream <boost :: iostreams :: array_source>不设置EOF </boost :: iostreams :: array_source>

时间:2012-12-05 15:59:40

标签: 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循环永远不会结束。有什么问题?

编辑:使用流的read方法按预期工作。使用其他任何东西(包括运算符&gt;&gt;)都不行

2 个答案:

答案 0 :(得分:2)

使用readome()的方式有两个问题,除了一般注释,它是完全可选的。

  1. readsome()的目的是通过最后一次调用rdbuf()->underflow()从已经从字符源拉入流的内部缓冲区的任何数据中获取接下来的n个字节。构造流时,它(在这种情况下)不会尝试立即从源读取,其缓冲区为空。 readsome()没有什么可以得到你。

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

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

  3. 以下适用于我的测试:

    #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()获取这种情况。

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

    时遇到的问题

答案 1 :(得分:0)

你可能在做tst >> memStream2;。您需要memStream2 >> tst;

中的std::cin >> var;