使用二进制模式将数据结构写入文件

时间:2012-08-16 03:10:24

标签: c++ c binaryfiles data-persistence

代码如下所示:

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

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

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

你可以做到,但你会有很多问题需要关注:

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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