c语言feof()函数问题

来源:百度知道 编辑:UC知道 时间:2024/06/14 21:07:04
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 10
#define QW
struct stu
{
int a;
char b[10];
char c[10];
double d;
int e;
double f;
}data[N];
void main()
{
int i,j=0;
struct stu a[N];
char ship;
FILE *fp;
printf("请输入:订单编号、公司名称、产品名称、产品订价、订购数量(输入每个数据都按Enter键):\n");
for(i=0;;i++)
{
scanf("%d",&data[i].a);
scanf("%s",data[i].b);
scanf("%s",data[i].c);
scanf("%lf",&data[i].d);
scanf("%d",&data[i].e);
getchar();
data[i].f=data[i].d*data[i].e;
printf("You input data is:\n");
printf("%10d",data[i].a);
printf("%10s",data[i].b);
printf("%10s",data[i].c);
printf("%10.2lf&quo

while(1)
{
fread(&a[j],sizeof(struct stu),1,fp);/*这里一旦读到结束位置,后面输出应停止,所以在fread后面增加判断即可*/
if(feof(fp)) break;
printf("%10d",a[j].a);
printf("%10s",a[j].b);
printf("%10s",a[j].c);
printf("%10.2lf",a[j].d);
printf("%10d",a[j].e);
printf("%10.2lf\n",a[j].f);
j++;
}
fclose(fp);
}
原因:
当遇到文件结束标志,不立即结束而再执行后面几个printf才结束,会由于%s输出遇不到字符串结束标志而一直向下输出,后面内容是随机的,当遇到字符串结束标志才停止。至于在那里停止,没有办法固定,要看内存单元%s正在访问位置是否是字符串结束标志。

fread(&a[j],sizeof(struct stu),1,fp);
if(feof(fp)) break; // 放到这里
printf("%10d",a[j].a); // 否则最后会多打印一次,打出 垃圾
printf("%10s",a[j].b);
printf("%10s",a[j].c);...

你的代码没什么大问题的
最后一个while中的 j++; 去掉就好了
还有可以改为while(!feof(fp))
{....}

有点小问题就是最后一次的数据总是输出两次 这个我没看出来 O(∩_∩)O~
要睡觉了