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