代码如下所示:
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
?
这让我想到了类似数据库的东西,剂量数据库以同样的方式将数据写入磁盘?
答案 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。