2 qq 34035545 qq_34035545 于 2016.03.24 23:53 提问

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 no\n"); scanf("%s",contin); }while(stricmp(contin,"yes")==0); for(wpoint=head;wpoint;wpoint=wpoint->next) if(fwrite(wpoint,STUDLEN,1,fp)!=1) printf("write error\n"); 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("姓名:%s\n性别:%s\n身高:%.2fcm\n体重:%.2fkg\n",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("error\n");break; } }while(menu!=0);}

3个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.25 08:55
已采纳

fopen,fclose系列函数似乎不是线程安全的,fclose以后立刻fopen确实有点bug
建议楼主注释掉前半部分,直接从读文件那里运行,看看先读取文件行不行,如果可以的话,说明造成这种情况的原因是fclose后马上又对同一个文件
fopen是有点BUG的

caozhy
caozhy   Ds   Rxr 2016.03.25 00:18

student.data这个文件是否存在,特别是如果你是windows系统,你是否选择了隐藏文件扩展名,你的文件是不是student.data.txt
有没有别的程序锁定这个文件

qq_34035545
qq_34035545 回复caozhy: 文件存在 能存数据进去 就是不能读出来啊
2 年多之前 回复
wangyaninglm
wangyaninglm   Ds   Rxr 2016.03.25 00:15

也许是文件路径的问题 ,题主应该把代码的错误信息发上来

qq_34035545
qq_34035545 回复shiter: 编译能通过 再读取数据的时候fread返还0吧
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于fread函数不能读全文件问题分析
有时朋友们会发现fread函数并未读全我们文件里的内容,这是因为系统默认文件结束符为ctrl+z,而0x1A的ASCII值恰巧与ctrl+z的ASCII值相等,所以遇到 0x1A fread就不再读文件。解决方案:把fp = fopen("文件地址.bin","r");改成fp = fopen("文件地址.bin","rb"); 备注:"r"读而打开文本文件     "rb"读而打开二进制文件
C中文件读取fread和fwrite 返回值等注意事项
#include        size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);        size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);  The  function  fread() read
C中fread()函数的建议使用方法
环境:Vmware Workstation;CentOS-6.4-x86_64 说明: 在使用fread函数的时候,最好使用下面的形式:fread(buf, sizeof(char), sizeof(buf), p); 单个字节读取,每次读取缓冲区的长度,这样就不会出现有些字节被舍弃的情况了。 程序步骤: 1、创建并编写源文件main.c: #include #include
一分钟了解“c语言读取文件中的数据fread”
函数原型 size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ; 参 数 buffer:用于接收数据的内存地址 size:要读的每个数据项的字节数,单位是字节 count:要读count个数据项,每个数据项size个字节. stream:输入流
C 语言 fwrite 和 fread 文件读写操作示例
#include int main() { FILE* pFile; float buffer[] = { 2.0 , 3.0 , 8.0 }; pFile = fopen("myfile.bin" , "wb"); // 打开文件写操作 fwrite(buffer , 1 , sizeof(buffer) , pFile); // 把浮点数组写到文件 myfil
c语言fread读取重复
用fread读取一个txt文件,老是在末尾处有一部分会重复读
C语言fread()函数:读文件函数(从文件流读取数据)
相关函数:fopen, fwrite, fseek, fscanf 头文件:#include 定义函数:size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream); 函数说明:fread()用来从文件流中读取数据.  参数stream 为已打开的文件指针, 参数ptr 指向欲存放读取进来的数据空间,
C语言的二进制IO函数fread()和fwrite()
C语言的二进制IO函数fread()和fwrite() 图片来源-百度图片 之前的fprintf()、fscanf()、fgets()和fputs()等标准I/O都是面向文本的,用于处理字符和字符串。例如,下面的代码:double num=1./3; fprintf(fp,"%f",num);把num存储为8个字符;0.333333。使用%0.2f转换说明将其存储为4个字符:0.33,用%0
c语言fwrite和fread连续读写文件流
c语言fwrite和fread连续读写文件流本例程的编写是基于windows,编译器用的是gnu下的gcc: 头文件stdio.h和stdlib.h 读写函数是fwrite和fread 文件指针移动函数有lseek,ftell,fseek *文件结束判断函数feof 函数的具体参数和返回值可查阅手册 连续写入long类型的一个数组 #include <stdio.h> #include <stdli
解决读取文件乱码问题
一般在windows上的txt文本文件要么以ANSI编码要么以Unicode编码,而用C ,C++,MFC编写的程序一般人只会处理一种编码格式的文本,因为不懂怎么判断读取的文件是以哪种编码格式存储的。那么重点就是判断读取的文件是以哪种方式存储的!有两种方式解决。一.用二进制方式打开文件,前两个字节为FFFE就是Unicode文件,ANSI则无格式定义. 如图: 这是以16进制打开Unicode文