Since the strstream classes will be deprecated in the future, I have been looking for an alternative to this class for performing binary I/O. stringstream indicates that you can use rdbuf()->pubsetbuf(buf,size) to set the internal streambuf to point to your binary data and then allow you to perform normal stream read/writes. The example below works with GNU but doesn't work with Visual C++ or Sun studio. The old istrstream way works fine but can't seem to get istringstream to work the same way. If this isn't the way to perform binary I/O, I'm looking for alternatives. The only way I was able to get this example to work was to create a stringstream open for input/output, write the buffer with a write command and then read back with my read method.
#include <sstream>
#include <iostream>
#include <iomanip>
typedef struct {
float f;
int i;
double d;
void print( std::ostream& o ) const {
o<<"f="<<f<<" i="<<i<<" d="<<d<<std::endl;
}
void read( std::istream& in ) {
// assumes everything is aligned properly for example purposes
in.read((char*)&f, sizeof(float));
if (!in.good()) std::cout<<"read failed: f\n";
in.read((char*)&i, sizeof(int));
if (!in.good()) std::cout<<"read failed: i\n";
in.read((char*)&d, sizeof(double));
if (!in.good()) std::cout<<"read failed: d\n";
}
void write( std::ostream& os ) {
os.write((char*)&f, sizeof(float));
if (!os.good()) std::cout<<"write failed: f\n";
os.write((char*)&i, sizeof(int));
if (!os.good()) std::cout<<"write failed: i\n";
os.write((char*)&d, sizeof(double));
if (!os.good()) std::cout<<"write failed: d\n";
}
} str_t;
main() {
using namespace std;
str_t sti, sto;
sti.f=1.0;
sti.i=2;
sti.d=3.0;
istringstream s(ios::binary);
sti.print(cout);
cout<<"sizeof(str_t)="<<sizeof(str_t)<<endl;
cout<<"in_avail: " << s.rdbuf()->in_avail()<<endl;
s.rdbuf()->pubsetbuf( (char*)&sti, sizeof(str_t));
cout<<"in_avail: " << s.rdbuf()->in_avail()<<endl;
if (!s.good()) cout << "string buffer error\n";
sto.read( s );
if (!s.good()) cout << "string buffer error after read\n";
sto.print(cout);
return 0;
}