使用fread/fwrite处理STL字符串。这样做正确吗?

4
我有一个结构体,其中包含字符串。类似于这样:
struct Chunk { int a; string b; int c; };
因此,我认为不能使用fread和fwrite函数从文件中读写此结构体,因为字符串可能会保留不同的内存容量。 但是,这样的代码可以正确工作。
Chunk var;
fwrite(&var,sizeof(Chunk),1,file);
fread(&var,sizeof(Chunk),1,file);
这里真的有问题吗?
3个回答

8
你对此表示怀疑是有道理的。你应该只使用fwritefread来流式传输POD类型,而string不是POD类型。

4
此外,指针是POD类型,但通常不易序列化。 - Ben Voigt
谢谢@Ben,我的术语不太准确。 - David Heffernan
3
对于POD类型,你仍然需要注意对齐问题。 对于结构体s{uint8_t c; uint64_t d};sizeof(struct s)可能不是9。 - user786653

2

不应该这样做,因为不同的实现使用不同的std::string结构。

通常情况下,您应该只序列化整数类型、布尔类型、二进制数据(如果您可以称之为序列化)。如果您想在平台之间共享序列化数据,请确保使用一种字节顺序。

小心处理浮点数、双精度和指针。它们可能会变得非常棘手。

您还需要小心处理 C/C++ 结构体,因为它们可能包含不可预测的填充量。


即使是结构体也存在问题,因为它们包含不可预测的填充量。如果您在同一程序和处理器中读取数据并编写它,则可能没有问题,但这绝对不是可移植的。您真的必须递归地单独序列化结构成员。 - Kerrek SB

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接