повышение :: iostreams :: поток & Lt; повышение :: iostreams :: array_source & GT; не устанавливает EOF

Образец:

namespace  boostio = boost::iostreams;
boostio::stream<boostio::array_source> memStream(arr);while (!memStream.eof())
{
char tst[2];

memStream2.readsome(tst, 2);
}

Здесь я инициализирую memstream массивом char, но цикл while никогда не заканчивается. В чем проблема ?

РЕДАКТИРОВАТЬ: Использование метода чтения потока работает, как и ожидалось. Использование чего-либо еще (включая оператор >>) не разрешено

2

Решение

Есть две проблемы с использованием readsome (), как вы делаете, помимо общего комментария, что это совершенно необязательно.

  1. Цель readsome() состоит в том, чтобы получить следующие n байтов из любых данных, которые уже были извлечены из источника символов во внутренний буфер потока при последнем вызове rdbuf()->underflow(), Когда поток создается, он не пытается (в этом случае) немедленно прочитать из источника, его буфер пуст. readsome () не имеет ничего, чтобы получить вас.

    редактировать: технически, в этом случае он возвращается к (также совершенно необязательно) showmanyc(), чтобы узнать, сколько данных доступно в источнике данных, но в этой реализации showmanyc случается, чтобы вернуть «не уверен» (ноль).

  2. Даже если вы заполняете буфер потока (с помощью обычного 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 ())`. Вам нужно будет предоставить тест случай, который демонстрирует проблему, с которой вы столкнулись с оператором >>

2

Другие решения

Вы, вероятно, делаете tst >> memStream2;, Вам нужно сделать memStream2 >> tst; как в std::cin >> var;

0