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

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

有些时候,程序的结构体可能存储了一些配置信息、历史数据等。不管什么原因,总有需要存储到文件中(或无文件系统的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;
}

如果有错误,欢迎交流。

猜你喜欢

转载自blog.csdn.net/u010333084/article/details/80625660