C语言 结构体指针字符 二进制文件写入和读取
typedef struct s{
char *name;
}student;
/*将结构体读出并显示*/
int IsUsed(char str)
{
FILE *fp = fopen("test","rb");
student s;
s.name = (char) malloc(sizeof(char)*20);
fread(&s,sizeof(student),1,fp);
while(!feof(fp)){
printf("%s",s.name); //为什么这里出错??????????????????
if(strcmp(s.name,str)==0){
fclose(fp);
return 1; //存在该字符串,则返回1
}
fread(&s,sizeof(student),1,fp);
}
fclose(fp);
return 0; //不存在该字符串,则返回0
}
int main()
{
FILE fp = fopen("test","rb+");
/先将结构体P存入二进制文件中*/
student p;
p.name = (char*) malloc(sizeof(char)*20);
scanf("%s",p.name);
while(IsUsed(p.name)){ //检查员工号是否唯一
printf("该字符串已经存在,请更换一个:");
scanf("%s",p.name);
}
fwrite(&p,sizeof(student),1,fp);
}
在printf哪里显示程序停止工作!!!!!!!!!求解啊
------解决方案--------------------
fread(&s,sizeof(student),1,fp);
即使你对s.name申请了空间. 但实际s本身还是只占一个指针, 通常也就是4字节空间.
你在这里从文件读取了一个数给这个指针, 即s.name的值就被修改了, 即name这个指针地址被修改了, 你前面的分配等于是白做了. 也产生了内存泄漏.
sizeof只能对student本身计算大小, 也就是指针本身所占的大小,4字节.
要保存这个串, 在保存的时候应该这么做.
fwrite(s.name,1,strlen(s.name),pFile);
读取的时候,先给s.name分配足够的空间,比如100,注意要为\0分配好空间.
fread(s.name,1, 100,pFile).
------解决方案--------------------
引用:Quote: 引用:fread(&s,sizeof(student),1,fp);
即使你对s.name申请了空间. 但实际s本身还是只占一个指针, 通常也就是4字节空间.
你在这里从文件读取了一个数给这个指针, 即s.name的值就被修改了, 即name这个指针地址被修改了, 你前面的分配等于是白做了. 也产生了内存泄漏.
sizeof只能对student本身计算大小, 也就是指针本身所占的大小,4字节.
要保存这个串, 在保存的时候应该这么做.
fwrite(s.name,1,strlen(s.name),pFile);
读取的时候,先给s.name分配足够的空间,比如100,注意要为\0分配好空间.
fread(s.name,1, 100,pFile).
也就是说我fread出来后s.name的值不一定是我当初存入的那个指针、指针值改变了,所以我printf的时候可能读的是非法内存。。。就会出现“程序出现错误”那种windows提示?
你说的fwrite(s.name....)和fread(s.name....)只是用于结构体中只有这一个name,我结构体中如果包含多项指针字符串呢?
是不是 fread和fwrite在 对结构体中指针字符的操作真的不好用、??
如果有多项指针, 那肯定要写多次了.
如果直接保存结构体, 只会保存结构体当前的东西, 指针就仅保存指针的值, 但是指针指向的内容却没有保存