Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using fread/fwrite for STL string. Is it correct?

I have a structure, that contain string. Something like that:

struct Chunk { int a; string b; int c; };

So, i suppose, that i cannot write and read this structure from file using fread and fwrite functions. Because string may reserve different memory capacity. But such code works correctly.

Chunk var;

fwrite(&var, sizeof(Chunk), 1, file);

fread(&var, sizeof(Chunk), 1, file);

Is there really some problems in it?

like image 323
Vera Avatar asked Dec 28 '22 17:12

Vera


2 Answers

You are justified in doubting this. You should only stream POD types with fwrite and fread and string is not POD.

like image 57
David Heffernan Avatar answered Dec 30 '22 09:12

David Heffernan


You shouldn't do it like this, because different implementations use different structures of std::string.

In general you should only serialize integral types, the boolean type, binary data (if you can call it serializing). Make sure to use one endian-ness if you are thinking of sharing serialized data between platforms.

Watch out with floats, doubles and pointers. They can become very pesky.

You'll have to watch out with C/C++ structs too ebcause they can contain unpredictable amounts of padding.

like image 22
orlp Avatar answered Dec 30 '22 10:12

orlp