Hello *,

I really enjoyed working with Iostreams, while testing some of my components. Using IOStreams with array_device seemed to be a very powerfull approach to test some of my stream based algorithms. But currently I face some issues which seem to be really weired to me. I produced some code snippet to better explain it. I used Boost.Test library to verify my assumptions.

    using namespace boost;
    namespace io=boost::iostreams; 
   
    typedef unsinged char byte;
    typedef array<byte, 2> arr_buffer;  //boost::array
    typedef io::basic_array<byte> arr_dev;

    arr_buffer buffer_ = {{}};
    arr_dev dev_(buffer_.begin(), buffer_.end());
    io::stream<arr_dev> ios_(dev_);

    arr_dev::pair_type range = dev_.input_sequence();
    BOOST_MESSAGE("size: " << distance(range.first, range.second)); // output: size is 2


    BOOST_CHECK_EQUAL(0u, ios_.tellg());  //stream is at position 0 as expected
    ios_.seekg(1);
    BOOST_CHECK_EQUAL(1u, ios_.tellg()); // stream is at position 1 as expected
    ios_.seekg(2);
    BOOST_MESSAGE("current pos: " << ios_.tellg()); // !!! stream is at position 2
    ios_.seekg(3);
    BOOST_MESSAGE("current pos: " << ios_.tellg()); // stream is at position -1
    BOOST_MESSAGE("eof: " << ios_.eof()); // !!! but eof is false


If the defined stream is only 2 bytes long why is 2 a valid stream position? Why is eof always false? Do you think this behavior is buggy?

I changed the same behavior to read bytes from stream and created an array of length 3, but passed the range of 2 bytes to the device ctor. This works as expected:

    arr_buffer buffer_ = {{'a', 'b', 'c'}};
    arr_dev dev_(buffer_.begin(), buffer_.begin()+2); //range of 2 bytes is passed
    io::stream<arr_dev> ios_(dev_);

    arr_dev::pair_type range = dev_.input_sequence();
    BOOST_MESSAGE("size: " << distance(range.first, range.second));

    byte bt;

    BOOST_MESSAGE("current pos: " << ios_.tellg()); // prints 0
    BOOST_CHECK_EQUAL(0u, ios_.tellg());
    ios_.read(&bt, 1);
    BOOST_MESSAGE("retrieved: " << bt);   // prints 'a'

    BOOST_MESSAGE("current pos: " << ios_.tellg()); //prints 1
    BOOST_CHECK_EQUAL(1u, ios_.tellg());
    ios_.read(&bt, 1);
    BOOST_MESSAGE("retrieved: " << bt); // prints 'b'

    BOOST_MESSAGE("current pos: " << ios_.tellg()); // !!! prints 2, why not -1???
    ios_.read(&bt, 1);
    BOOST_MESSAGE("retrieved: " << bt); // still prints 'b' => nothing retrieved
    BOOST_MESSAGE("current pos: " << ios_.tellg());  // !!! now it prints -1
    BOOST_MESSAGE("eof: " << ios_.eof()); // !!! now eof is true

Any ideas why it behaves as described?


With Kind Regards,
Ovanes