2

样本:

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


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

    memStream2.readsome(tst, 2);
}

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

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

4

2 回答 2

2

以您的方式使用 readsome() 有两个问题,除了一般评论认为它是完全可选的。

  1. 的目的readsome()是从上次调用rdbuf()->underflow(). 构造流时,它不会(在这种情况下)尝试立即从源读取,它的缓冲区是空的。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 对此很聪明,当我读取第一个字符时,它使流缓冲区的内部指针直接指向数组,因此在这种情况下,可以从 readsome() 中获取所有要读取的内容。

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

于 2012-12-06T04:05:39.773 回答
0

你可能正在做tst >> memStream2;. memStream2 >> tst;你需要这样做std::cin >> var;

于 2015-07-01T14:52:08.563 回答