映屿

C语言下的二进制文件IO踩坑

C语言下的二进制文件读写有个坑,就是一定要按存储的顺序读取。例:

typedef struct player {
	int id;
	double XP;
	double MP;
}player;

这里有一个玩家的数据结构,我们创建变量并初始化。

int b_i[32] = {1, 233, 2453, 5432, 21 ,43 ,297, 752, 643};
player yingyu5658;
yingyu5658.MP = 100;
yingyu5658.XP = 100;
yingyu5658.id = 114514;

对文件进行存储时,按照MP=>XP=>ID的顺序存储

pd = fopen("./data", "wb");
fwrite(&yingyu5658.MP, sizeof(double), 1, pd);
fwrite(&yingyu5658.XP, sizeof(double), 1, pd);
fwrite(&yingyu5658.id, sizeof(int), 1, pd);

读取的时候一定要按照这个顺序,否则读取出来的内容是无效的。

int id;
double XP, MP;
pd = fopen("./data", "rb");
fread(&MP, sizeof(double), 1, pd);
fread(&XP, sizeof(double), 1, pd);
fread(&id, sizeof(int), 1, pd);
player new_player;
new_player.id = id;
new_player.XP = XP;
new_player.MP = MP;
printf("id: %d\n", new_player.id);
printf("XP: %f\n", new_player.XP);
printf("MP: %f\n", new_player.MP);

运行结果:

写入了id: 114514
写入了XP: 100.000000
写入了MP: 100.000000

id: 114514
XP: 100.000000
MP: 100.000000

使用完也要关闭流,否则资源泄漏

fclose(pd);  // 必须显式关闭

有想对我说的?发一封邮件吧

______ ____ _____ _____ _____ _________ _______ _ __ _ _ .' ___ ||_ \|_ _||_ _||_ _| | _ _ | |_ __ \ / |_ [ | / |_ / |_ / .' \_| | \ | | | | | | |_/ | | \_|.---. _ .--. _ .--. _ __ | |__) |_ .--. ,--. `| |-'.---. | |--. .---.`| |-'`| |-' | | ____ | |\ \| | | ' ' | | | / /__\\[ `/'`\][ `/'`\][ \ [ ] | ___/[ `/'`\]`'_\ : | | / /'`\] | .-. |/ /__\\| | | | \ `.___] |_| |_\ |_ \ \__/ / _| |_ | \__., | | | | \ '/ / _| |_ | | // | |,| |,| \__. | | | || \__.,| |, | |, `._____.'|_____|\____| `.__.' |_____| '.__.'[___] [___] [\_: / |_____| [___] \'-;__/\__/'.___.'[___]|__]'.__.'\__/ \__/ \__.' "A man is not dead while his name is still spoken."