0

代码如下所示:

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

4 回答 4

2

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

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

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

于 2012-08-16T03:13:46.420 回答
2

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

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

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

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

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

于 2012-08-16T03:23:23.850 回答
1

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

于 2012-08-16T03:24:29.437 回答
0

C++ 中间件编写器支持文件的二进制序列化。

从编组的角度来看,结构的“无符号整数年龄”成员是一个潜在的问题。我会考虑将类型更改为 uint32_t。

于 2012-08-16T15:30:44.007 回答