#include<stdio.h>
#include<string.h>
#include <stdlib.h>
// 将以下结构体类型变量,以二进制的形式存放到文件中,并且可以实现读的接口,打印读出来信息。
typedef struct Student
{
char *name; //名字
int id;
int name_len; //名字长度
}Stu;
int main()
{
Stu s; //定义结构体变量
//结构体成员赋值
s.id = 1;
s.name_len = strlen("mike"); //名字长度
s.name = (char *)malloc(s.name_len + 1);
strcpy(s.name, "mike");
FILE *ff=fopen("信息.txt","w");
if(!ff)
{
perror("2");
return -1;
}
printf("%s %d %d",s.name,s.id,s.name_len);
int num=fwrite(&s,1,sizeof(Stu),ff);//只把结构体里的char *name字符串指针变量写入文件,没有把字符串写入文件,应该在后面把name指向的字符串写入文件
printf("共存入%d个字节!",num);
num=fwrite(s.name,1,s.name_len + 1,ff);//读取时别忘了读完一个结构体在读入一个字符串
printf("共存入%d个字节!",num);
fclose(ff);
ff=fopen("信息.txt","r");
if(!ff)
{
perror("1");
return -1;
}
Stu ss;
free(s.name);
ss.name=NULL;
ss.name=(char *)malloc(64);
if(ss.name==NULL) return 1;
int nuu=fread(&ss,1,sizeof(Stu),ff);
printf("共%d个字节!",nuu);
nuu=fread(ss.name,1,ss.name_len+1,ff);
printf("共%d个字节!",nuu);
printf("%s %d %d",ss.name,ss.id,ss.name_len);
free(ss.name);
return 0;
}
假如我改成这样先释放掉free(s.name),然后重新开辟ss.name ,这里运行调试至free(ss.name)还是会崩 |