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 (http://tinyurl.com/2ptvu2), 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: http://www.boost.org/boost/iostreams/filter/gzip.hpp. 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 CodeRage http://www.coderage.com