【问题标题】:write data structure into a file using binary mode使用二进制模式将数据结构写入文件
【发布时间】:2012-08-16 03:10:24
【问题描述】:

代码如下:

struct Dog {
  string name;
  unsigned int age;
};

int main()
{
    Dog d = {.age = 3, .name = "Lion"};
    FILE *fp = fopen("dog.txt", "wb");
    fwrite(&d, sizeof(d), 1, fp);   //write d into dog.txt
}

我的问题是将数据对象或结构写入二进制文件有什么意义?我认为这是为了使正在运行的程序中生成的数据持久化,对吗?如果是,那么我该如何取回数据?使用fread?

这让我想到了类似数据库的东西,数据库以同样的方式将数据写入磁盘?

【问题讨论】:

  • 你真的在谈论C吗?字符串类型到底是什么?

标签: c++ c binaryfiles data-persistence


【解决方案1】:

你可以做到,但你需要关心很多问题:

  • 结构类型:你所有的数据需要真的到结构中,或者你可以写一个指向其他地方的指针。
  • 结构更改:如果您需要更改结构,则需要编写一个转换器来读取旧结构并写入新结构。
  • 语言互操作性:使用其他语言将难以访问数据

在关系数据库普及之前的早期,这是一种常见的做法。您可以使索引文件指向记录号。

但是,现在我建议您进行序列化并编写字符串而不是二进制文件。

注意: 如果 string 类似于 char[40] 你的代码可能会存活下来......但是如果你的问题是关于 C++ 并且 string 是一个类,那么在你的孩子长大之前杀死它!字符串对象字符不在您的结构中,而是在堆中。

【讨论】:

  • 为什么要写字符串而不是二进制文件?
  • 以非固定大小格式(csv、Jason、XML...)编写字符串会使上述所有声明对您有利。关于 c++ 字符串类型的事情就可以了,将更容易添加新属性并与任何其他语言集成。
【解决方案2】:

以二进制写入数据非常有用,并且比以文本读取/写入要快得多,例如视频游戏(虽然不是每个视频游戏都这样做),当游戏保存所有必要的结构/类和其他数据时以二进制形式写入保存文件。

这只是使用二进制的一种用途,但这样做的主要原因是速度。

并且要读回数据,您需要知道保存它的格式,例如,作为一个简单的例子,如果我保存了一个整数、n 大小的 char 数组和一个布尔值,我需要将二进制文件作为整数、n 大小的 char 数组和布尔值读取。否则数据读取不正确,根本没有多大用处

【讨论】:

  • 另外我会考虑使用 C++ fstream 类,因为它更容易使用并且省去了很多麻烦。
  • 如果您使用 C,fstream 有什么用处?
  • 他把它标记为 C,但是有一个字符串类型使它看起来像 C++。
  • 这就是我指定 C++ 的原因...对吗?没有理由不使用 C++ 和 C,C 可能不会被弃用,但它已被大大扩展,我能想到的每个编译器都允许使用两者。真正的问题是,为什么要阻止人们使用高度优化且广泛使用的类,而这种类几乎肯定可用于 OP
  • 为什么比使用文本模式更快?
【解决方案3】:

小心。结构中字段“名称”的类型是“字符串”。此类包含动态分配的数据。因此,以这种方式将“字符串”数据写入文件只会写入指针,不会写入数据本身。

【讨论】:

  • 正确,如果它是您使用的 C++ 字符串类,那么您将需要使用 string.c_str() 来检索 char 字符串,并使用 string.size() * sizeof(char)字符串的大小。
  • 那我应该如何将name的数据写入文件呢? fwrite(name.c_str(), name.size(), 1, fp)?\
  • 在这种情况下,您还必须将字符串长度写入文件。相反,您无法正确阅读它。或者您可以将 '\0' 写入字符串的末尾。
  • 确切地说,需要一个空终止或包含大小的标头。
【解决方案4】:

C++ Middleware Writer 支持文件的二进制序列化。

从编组的角度来看,结构的“unsigned int age”成员是一个潜在的问题。我会考虑将类型更改为 uint32_t。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多