Есть две проблемы с использованием readsome () так, как вы делаете, помимо общего комментария, что это совершенно необязательно.
Цель readsome()
- получить следующие n байтов из тех данных, которые уже были загружены из источника символов во внутренний буфер потока последним вызовом rdbuf()->underflow()
. Когда поток создается, он (в данном случае) не пытается немедленно читать из источника, его буфер пуст. readsome () ничего вам не даст.
edit: технически в этом случае он возвращается к (также совершенно необязательному) 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 хорошо разбирается в этом вопросе, и когда я читаю первый символ, он помещает внутренние указатели потокового буфера непосредственно в массив, поэтому в этом случае все, что осталось прочитать, можно получить из readsome ().
Теперь, что касается оператора >>, memStream >> setw(2) >> tst;
у меня отлично работает (надеюсь, вы вспомнили о setw при использовании >> в массиве !!), несмотря на использование условия ошибочного цикла «while (! Stream.eof ()) `. Вам нужно будет предоставить тестовый пример, демонстрирующий проблему, с которой вы столкнулись с оператором >>
person
Cubbi
schedule
06.12.2012
memStream
инициализируется неинициализированным массивомtst[2]
- это может быть источником бесконечного цикла. Может помочь объявление и присвоение массиву значимого значения. - person damienh   schedule 05.12.2012eof
как условие завершения цикла. Существует множество причин отказа, не относящихся к EOF. См. latedev.wordpress.com/2012/12/04/all- about-eof - person Billy ONeal   schedule 06.12.2012