Boost logo

Boost Users :

From: Jonathan Turkanis (turkanis_at_[hidden])
Date: 2008-03-05 12:14:39

Robert Dailey wrote:
> On second thought, even though I've found the operators they don't do
> what I expected them to do in my tests. So, I have the following stream,
> which is a seekable device:
> boost::iostreams::stream<MyStreamDevice> IOStream;
> void foo()
> {
> char data;
> IOStream >> data;
> }
> I expected here that MyStreamDevice::read() would be called with a
> request for 1 byte,

Boost.Iostreams provides buffering automatically, so I would expect that
the request to read would ask for a full buffer of data. The buffer size
can be set at construction (, but is never
zero because of the need for filters to be able to put back characters.
Try specifying a buffer size of 0 and a putback buffer size of 1 if you
want a small buffer.

What behavior are you observing?

> since the sizeof( data ) is 1 byte. I want my stream
> to act as binary, so the bitshift operators should attempt to "fill" the
> right operand with as much as it can. For longs, this would be 4 bytes
> for example.

Standard iostreams do not support binary i/o directly. When you attempt
to read a long from a stream, the stream attempts to interpret the first
few characters in the stream as a formatted number, depending on the
locale. For example:

     #include <assert>
     #include <stringstream>

     int main()
       std::istringstream in("10000");
       long x;
       in >> x;
       assert(x == 10000);

If you want to do binary i/o, you should not use the overloaded bitshift
operators at all. Use the unformatted operations (such as istream::get,
istream::read, streambuf::sgetc, streambuf::sgetn) to read one or more
characters, then examine the characters carefully, taking into account
sign and byte order.

You can see some examples here: Look for the
functions read_uint8 and read_unit32, and the functions that call them.

> Do I have to overload my own generic bitshift operators for this
> behavior or does Boost.Iostreams supply some overloaded bitshift
> operators that provide such functionality?

Jonathan Turkanis

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at