结构体数组在文件中的读写方法
有些时候,程序的结构体可能存储了一些配置信息、历史数据等。不管什么原因,总有需要存储到文件中(或无文件系统的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);
}
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;
}
如果有错误,欢迎交流。