问题描述
- c语言为什么fread读取失败
-
#include #include #include #define STUDLEN sizeof(student)typedef struct _student{ char name[10]; char sex[5]; float weight; float high; struct _student *next;}student;void Free(student *head); void input(){ student *head=NULL,*p,*ptemp,*wpoint; char name[10],contin[5]; char sex[5]; float weight; float high; FILE *fp=fopen("student.data","ab+"); if(fp==NULL) { printf("打开文件失败n"); exit(1); } do{ printf("输入学生姓名:"); scanf("%s",name); printf("输入性别:"); scanf("%s",sex); printf("输入体重:"); scanf("%f",&weight); printf("输入身高:"); scanf("%f",&high); p=(student *)malloc(STUDLEN); strcpy(p->name,name); strcpy(p->sex,sex); p->weight=weight; p->high=high; p->next=NULL; ptemp=head; if(head) { while(ptemp->next) ptemp=ptemp->next; ptemp->next=p; } else head=p; printf("继续录入信息?yes or non"); scanf("%s",contin); }while(stricmp(contin,"yes")==0); for(wpoint=head;wpoint;wpoint=wpoint->next) if(fwrite(wpoint,STUDLEN,1,fp)!=1) printf("write errorn"); Free(head); fclose(fp); } void Free(student *head){ for(;head;head=head->next) free(head);}void find(){ FILE *fp=fopen("student.data","rb"); char name[10]; student *p; if(fp=NULL) printf("打开文件失败n"); printf("请输入姓名n"); scanf("%s",name); while(!feof(fp)) { if(fread(p,STUDLEN,1,fp)!=1) { printf("读取失败n"); break; } else { if(strcmp(p->name,name)) { printf("姓名:%sn性别:%sn身高:%.2fcmn体重:%.2fkgn",p->name,p->sex,p->high,p->weight); break; } } } fclose(fp); } void main(){ int menu; void input(); void find(); printf("请选择:n"); do { printf("1.输入学生信息n"); printf("2.查询学生信息n"); printf("0.退出系统n"); scanf("%d",&menu); switch(menu) { case 1:input();break; case 2:find();break; case 0:break; default:printf("errorn");break; } }while(menu!=0);}
解决方案
fopen,fclose系列函数似乎不是线程安全的,fclose以后立刻fopen确实有点bug
建议楼主注释掉前半部分,直接从读文件那里运行,看看先读取文件行不行,如果可以的话,说明造成这种情况的原因是fclose后马上又对同一个文件
fopen是有点BUG的
解决方案二:
student.data这个文件是否存在,特别是如果你是windows系统,你是否选择了隐藏文件扩展名,你的文件是不是student.data.txt
有没有别的程序锁定这个文件
解决方案三:
也许是文件路径的问题 ,题主应该把代码的错误信息发上来
时间: 2024-10-22 19:09:38