样品:
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;)都不行
答案 0 :(得分:2)
使用readome()的方式有两个问题,除了一般注释,它是完全可选的。
readsome()
的目的是通过最后一次调用rdbuf()->underflow()
从已经从字符源拉入流的内部缓冲区的任何数据中获取接下来的n个字节。构造流时,它(在这种情况下)不会尝试立即从源读取,其缓冲区为空。 readsome()没有什么可以得到你。
编辑:从技术上讲,在这种情况下,它会回退到(也是完全可选的)showmanyc()
,以找出数据源中有多少数据可用,但在此实现中showmanyc
恰好返回“不确定”(零)。
即使你填充流缓冲区(通过常规的read()或get()等),readome也不会在到达流缓冲区的末尾时设置任何流标志:它不知道如果源中有更多可用数据(因为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()获取这种情况。
现在,对于运算符&gt;&gt;,memStream >> setw(2) >> tst;
对我来说非常合适(我希望你在数组上使用&gt;&gt;时记住setw),尽管使用了错误的循环条件“while(!stream.eof())`。您需要提供一个测试用例,演示您在运算符&gt;&gt;
答案 1 :(得分:0)
你可能在做tst >> memStream2;
。您需要memStream2 >> tst;
std::cin >> var;