(转)c fread()在判断文件结束时需要注意的一些事
来源:互联网 发布:网络上门服务电话 编辑:程序博客网 时间:2024/05/21 09:56
样本程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int ele1;
int ele2;
char ch[20];
}ttt; //结构体.
void addInfo(int *n)
{
FILE *file=fopen("wmx.dat","w");
int i=0;
ttt myttt;
for(i=0;i<10;i++) //初始化文件,输入10条记录.
{
myttt.ele1=((i+100)*7+i)%107;
myttt.ele2=((i+309)*5+65)%43;
strcpy(myttt.ch,"dkldfjd");
(*n)++;
fwrite(&myttt,sizeof(ttt),1,file); //写入.
}
fclose(file);
}
void readFile(int *n)
{
FILE *file=fopen("wmx.dat","r");
ttt myttt;
if(file==NULL)
{
printf("打开文件失败.\n");
exit(0);
}
while(!feof(file)) //此处打印的最结果是11条记录.
{
fread(&myttt,sizeof(ttt),1,file);
printf("%d %d %s\n",myttt.ele1,myttt.ele2,myttt.ch);
// (*n)++;
}
fclose(file);
}
int main()
{
int n=0;
addInfo(&n);
readFile(&n);
printf("%d\n",n);
return 0;
}
问题处在fread上,用feof判断有问题,可以改为:
while (1)
{
memset(&myttt, 0, sizeof(myttt));
if (fread(&myttt, sizeof(ttt), 1, file) == 1)
{
printf();
}
else
{
break;
}
}
原因:feof(file) 的作用是检测读取到的数据是否为文件结束。读完最后一行记录后,file->_flag 没有被置为_IOEOF,因为已经读取到记录了, feof() 没有探测到文件结尾。直到再次调用 fread()读取记录时,才获取文件结束标志,feof() 探测到文件结尾。
当再次调用 fread(&myttt,sizeof(ttt),1,file); 时,myttt 没有获取任何内容,还是上次读取的数据,输出时,当然是跟上次一样。
修改如下:
void readFile(int *n)
{
FILE *file=fopen("wmx.dat","r");
ttt myttt;
if(file==NULL)
{
printf("打开文件失败.\n");
exit(0);
}
// 检测文件长度,如果大于 0,先读取一行。
if(file->_bufsiz>0)
{
fread(&myttt,sizeof(ttt),1,file);
}
while(!feof(file)) //此处打印的最结果是11条记录.
{
printf("%d %d %s\n",myttt.ele1,myttt.ele2,myttt.ch);
// 当读取完数据后,读取出文件结束标志,
// 回到 while 时,就不再输出下一行了。
fread(&myttt,sizeof(ttt),1,file);
}
fclose(file);
}
- (转)c fread()在判断文件结束时需要注意的一些事
- 在以二进制文件打开方式打开文件的时候,fread返回值判断文件是否结束的问题
- 使用fwrite,fread需要注意的问题
- C语言需要注意的一些问题
- C语言一些需要注意的问题
- 关于在创建文件时需要注意的问题
- 一些需要注意的
- 文件结束的判断
- 在C语言中关于scanf()函数需要注意的一些事项
- fread读取文件注意
- while判断值为cin输入值时,注意调试时要用文件结束符结束循环
- [小结]C语言的文件操作函数fopen,fread,fwrite注意点
- 使用异常时需要注意的一些问题(转)
- C语言中需要注意的一些地方
- c语言中需要注意的一些地方
- C/C++中需要注意的一些问题
- Android .mk文件中需要注意的一些宏
- 在web项目中一些需要注意的问题
- linux安装JDK(JDK1.7)
- STL基本范例
- nginx ——redhat5.5 实现负载均衡
- iterator与const_iterator及const iterator区别
- 《黑客与画家》中的只言片语
- (转)c fread()在判断文件结束时需要注意的一些事
- 使用初始化清单和直接在构造函数内初始化成员变量的区别
- 英尺的转换
- 配置Editplus的PHP调试环境(三)
- 类模板总结与补充
- CXF框架简单的JavaBean对象传递进行讲解。
- poj3984迷宫问题 广搜+最短路径+模拟队列
- 将应用程序注册成后台服务程序
- Google Hacking(谷歌黑客)