对 STL 字符串使用 fread/fwrite。正确吗?

发布于 2024-11-25 16:02:08 字数 377 浏览 1 评论 0原文

我有一个包含字符串的结构。像这样的东西:

struct Chunk { 整数a; 字符串 b; 整数c; 因此

,我想我无法使用 fread 和 fwrite 函数从文件中写入和读取此结构。因为字符串可能保留不同的内存容量。 但这样的代码可以正常工作。

Chunk var;

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

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

这里面真的有问题吗?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

嘴硬脾气大 2024-12-02 16:02:08

你有理由怀疑这一点。您应该仅使用 fwritefread 流式传输 POD 类型,并且 string 不是 POD

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

第几種人 2024-12-02 16:02:08

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

一般来说,你应该只序列化整型、布尔类型、二进制数据(如果你可以称之为序列化)。如果您考虑在平台之间共享序列化数据,请确保使用一种字节序。

小心浮点数、双精度数和指针。他们会变得非常讨厌。

您也必须注意 C/C++ 结构,因为它们可能包含不可预测的填充量。

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.

不忘初心 2024-12-02 16:02:08

您应该序列化数据。

您可能想手动执行此操作 - 当涉及 std::string 时,请查看:

当涉及到更复杂的对象时,您可能会对 Google Protocol Buffers 和/或 Thrift 之类的东西。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文