示例:
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()
的目的是从上次调用时已从字符源拉入流的内部缓冲区的任何数据中获取接下来的 n 个字节rdbuf()->下溢()
。当构造流时,它不会(在这种情况下)尝试立即从源读取,它的缓冲区是空的。 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对此很聪明,当我读取第一个字符时,它使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/