结构体数组在文件中读写的方法

结构体数组在文件中的读写方法

有些时候,程序的结构体可能存储了一些配置信息、历史数据等。不管什么原因,总有需要存储到文件中(或无文件系统的FLASH中),并在合适的时候读取出来。用术语说,这个需求实际上是内存对象的序列化和反序列化过程,感兴趣的同学可以前去学习序列化和反序列化的相关知识。

下面以结构体数组在文件中的读写为例:

#include <stdio.h>
#include <stdlib.h>

typedef unsigned int uint32;

typedef struct{
	int a;
	int b;
	char c[32];
}MyStruct;

写函数

写函数传入参数为uint32类型的buffer指针,还有要写入的buffer长度。在函数内部,通过while循环,我们准备每次向文件中写入1个word,即32位,即4bytes,因为一次写1个word,因此每次循环bufflen-4,buffer要写下一个位置,要buffer+1,注意此处是+1不是+4,因为buffer类型为uint32,+1实际地址就+4了。

void write(uint32 *buffer, uint32 bufflen){
	FILE *FP = fopen("flash.hex","wb");
	while(bufflen){
		fwrite(buffer,sizeof(uint32),1,FP);
		//printf("%x-",*buffer);
		buffer ++; //一次加一个变量
		bufflen -= 4;
	}
	fclose(FP);
}

上述过程是一个序列化的过程。

读函数

将文件内结构体长度全部读出,注意参数buffer的空间要在外部先申请好。

void read(uint32 *buffer){
	FILE *FP = fopen("flash.hex","rb");
	fread(buffer,sizeof(uint32),120,FP);
	fclose(FP);
}

上述过程是一个反序列化的过程。

读与写的测试Demo

int main(void) {

	MyStruct TS[10];
	for(int i= 0; i<10; i++){
		TS[i].a = i;
		TS[i].b	= i;
		char str[32];
		memset(TS[i].c,0,32);
		strcpy(TS[i].c,"hello");
	}
	
    ///结构体数组总长度    
	uint32 bufflen = sizeof(MyStruct) * 10;
	///将结构体数组的指针即首地址强转为uint32型
	write((uint32 *)TS,bufflen);

	uint32 *readbuf = (uint32 *)malloc(sizeof(MyStruct)*10);
	read(readbuf);
	MyStruct *rxp = (MyStruct *)readbuf;
	printf("%s",(*(rxp+5)).c);
	free(readbuf);

	MyStruct *p = TS;
	printf("%s",(*(p+5)).c);
	return EXIT_SUCCESS;
}

如果有错误,欢迎评论交流。

  • 5
    点赞
  • 0
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值