Vera
Vera

Reputation: 135

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?

Upvotes: 4

Views: 2755

Answers (3)

Grzegorz Wierzowiecki
Grzegorz Wierzowiecki

Reputation: 10843

You should serialize data.

You might like to do this manually - when it comes about std::string , check out:

When it comes about more complex objects, you might be interested in things like Google Protocol Buffers and/or Thrift.

Upvotes: 0

orlp
orlp

Reputation: 117846

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.

Upvotes: 2

David Heffernan
David Heffernan

Reputation: 613511

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

Upvotes: 8

Related Questions