linux c将数据结构整体写入文件并整体读取数据

当数据量过大的时候,存在内存中就不是一个合理的方式,就可以选取写入文件来进行保存,读取数据。

以下是一个demo,用来记录学习的。保存一下!

ps:附加fopen的参数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
    char s[100];
    int h;
} st2;
typedef struct
{
    char c;
    char *str;
    char s[100];
    int h;
    st2 k;
} st;
//写文件函数,将上面结构写入文件
int write()
{
    FILE *fp;
    st sa, sb;
    char *str = "abcdefg";
    sa.c = 'K';
    sa.str = "abcdefg";
    strcpy(sa.s, str);
    strcpy(sa.k.s, "fff");
    sa.k.h = 20;
    sa.h = -3;

    fp = fopen("st.txt", "w+");
    if (!fp)
    {
        printf("errror!\n");
        exit(-1);
    }
    printf("sa:c=%c,str=%s,s=%s,h= %d, k.s= %s, k.h= %d\n", sa.c, sa.str, sa.s, sa.h, sa.k.s, sa.k.h);
   // printf("sizeof(sa)=%d:&c=%x,&str=%x,&s=%x,&h=%x\n", sizeof(sa), &sa.c, &sa.str, &sa.s, &sa.h);
    fwrite(&sa, sizeof(sa), 1, fp);
    strcpy(sa.s, "hhjjj44433");
    fwrite(&sa, sizeof(sa), 1, fp);//写两次,模拟写入多个结构体
    //rewind(fp);
    //fread(&sb, sizeof(sb), 1, fp);
    //printf("sa:c=%c,str=%s,s=%s,h= %d\n", sa.c, sa.str, sa.s, sa.h);
    fclose(fp);

    return 0;
    
}
//主函数,在主函数调用写文件,并读取文件中数据并打印查看信息
int main(void)
{
    FILE *fp;
    st sb;
    write();
    fp=fopen("st.txt","r");
    if(!fp)
    {
        printf("errror!\n");
        exit(-1);
    }
    fread(&sb,sizeof(sb),1,fp);
    printf("read file sb:c=%c,str=%s,s=%s,h= %d, k.s= %s, k.h= %d\n", sb.c, sb.str, sb.s, sb.h , sb.k.s, sb.k.h);
    fread(&sb,sizeof(sb),1,fp);
    printf("read file2 sb:c=%c,str=%s,s=%s,h= %d, k.s= %s, k.h= %d\n", sb.c, sb.str, sb.s, sb.h , sb.k.s, sb.k.h);
   // printf("sizeof(sb)=%d:&c=%x,&str=%x,&s=%x,&h=%x\n", sizeof(sb), &sb.c, &sb.str, &sb.s, &sb.h);

    fclose(fp);

    return 0;
}

#if 0
输出结果:
sa:c=K,str=abcdefg,s=abcdefg,h= -3, k.s= fff, k.h= 20     //写文件处打印
read file sb:c=K,str=abcdefg,s=abcdefg,h= -3, k.s= fff, k.h= 20 //第一次读
read file2 sb:c=K,str=abcdefg,s=hhjjj44433,h= -3, k.s= fff, k.h= 20//第二次读

结论:
如果要用追加的方式写用”a+”方式打开文件;读取用“r”方式读取;ps:“a+”如果文件不存在会创建文件
#endif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值