2012-12-05 82 views
2

样品:升压::输入输出流::流<提高::输入输出流:: array_source>不设置EOF

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


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

    memStream2.readsome(tst, 2); 
} 

在这里,我初始化memstream与字符数组,但while循环并不会结束。问题是什么 ?

编辑:使用阅读方法的流工程如预期。使用其他任何东西(包括操作符>>)不正确

+0

'memStream'用一个未初始化的'tst [2]'数组初始化 - 这可能是无止境循环的来源。声明并为数组赋予一些有意义的值可能会有所帮助 – damienh

+0

@damienh,这只是为了使用readsome。 tst只是一个目的地。它不会在意复制时的内容。 – Gmt

+0

我也有使用操作符>>时出现这种问题。它仅在使用“读取”时才起作用,例如memStream2.read(tst,2)。 – Gmt

回答

2

使用readsome()有两个问题,除了一般性的评论,它是完全可选的。

  1. 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())`。你需要提供演示,你已经与运营商>>

+0

使用操作符时>>我试着举例。而(!memStream2。eof()) { int t = 0; memStream2 >> t; } – Gmt

+0

不会结束 – Gmt

+0

@Gmt尝试适当的I/O循环:'int t; while(memStream2 >> t){}' – Cubbi

0

你可能做tst >> memStream2;遇到的问题一个测试用例,你需要做的memStream2 >> tst;std::cin >> var;