使用readsome()有两个问题,除了一般性的评论,它是完全可选的。
的readsome()
目的是为了抓住从任何数据已经从字符源最后调用被拉进流的内部缓冲区rdbuf()->underflow()
下一个n个字节。当流构造时,它不会(在这种情况下)尝试立即从源读取,其缓冲区为空。 readsome()没有什么可以让你。
编辑:在技术上,它回落到(也完全可选)showmanyc()
,以找出有多少数据在数据源中可用,但在此实现showmanyc
恰好返回“不确定”(零) 。即使你通过一个普通的read()或get()等等)来填充流缓冲区,readsome也不会在流缓冲区结束时设置任何流标志:它不知道if源代码中有更多数据可用(因为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的setw !!),尽管使用了错误的循环条件“while(!stream。 EOF())`。你需要提供演示,你已经与运营商>>
'memStream'用一个未初始化的'tst [2]'数组初始化 - 这可能是无止境循环的来源。声明并为数组赋予一些有意义的值可能会有所帮助 – damienh
@damienh,这只是为了使用readsome。 tst只是一个目的地。它不会在意复制时的内容。 – Gmt
我也有使用操作符>>时出现这种问题。它仅在使用“读取”时才起作用,例如memStream2.read(tst,2)。 – Gmt