C的文件操作问题...急!(100分)

  • 主题发起人 主题发起人 张利中
  • 开始时间 开始时间

张利中

Unregistered / Unconfirmed
GUEST, unregistred user!
struct stud_grade
{int stud_id;
char name[8];
}grad_info[4];
通过C的写文件函数fwrite向文本文件stu.txt写入四组stud_grade类型的数据,
如{1001, "Tom"},{1002,"mary"},{1003,"TTT"},{1004, "peter"}
然后通过以下程序从stu.txt读取这四组结构体类型数据
main()
{ struct stud_grade *fp;
.......
.......
while(!feof(fp))
{fread(...);
printf(...);
}
}
如果fread每次读取一项stu_grade类型的数据,读四次即可读出所有数据。即
while循环四次,但实际运行却循环五次。屏幕显示如下:
1001 Tom
1002 mary
1003 TTT
1004 pete
-2292 *^$.
最后一行输出的是类似于-2292 *^$.的乱码。
我不明白,文件读取四次以后,文件指针就指到了文件尾,
为什么循环体循环5次,读取5次?还是我的循环条件不对?
请各位多多执教!.
 
while(!feof(fp)) {fread(...); printf(...); }
改成while(!feof(fp)) if(!feof(fp){fread(...); printf(...); }试试。
 
你肯定你只写进四组吗?
写循环会不会多写了?
 
修正一下:
main()
{ FILE *fp; /* fp是文件指针*/
.......
.......
while(!feof(fp))
{fread(...);
printf(...);
}
}
写循环并未写多, 我已通过单步执行验证过了!而且,因为是文本文件,写完后,可以直接
打开文件查看写入情况.
 
关于我的这个问题,现给出源代码:
struct st_grade
{int stu_id;
char name[8];
int math;
};
main()
{int i;FILE *fp;
struct st_grade grd_info[4];
struct st_grade grd[4];
clrscr();
printf("input 4 group data:/n");
for(i=1; i<=4; i++)
scanf("%d%s%d", &grd_info.stu_id, grd_info.name, &grd_info.math);

/* input 4 group data into file */
if( (fp=fopen("stu.txt","w"))==NULL )
{printf("open error!");exit(0);}
else
{for(i=1; i<=4; i++)
fwrite(&grd_info, sizeof(struct st_grade), 1, fp);
}
fclose(fp);
getch();

/* ouput 4 group data from file */
printf("Now output data from file:/n");
if( (fp=fopen("stu.txt","r"))==NULL )
{printf("open error!");exit(0);}
else
{for(i=1; i<=4; i++)
{fread(&grd, sizeof(struct st_grade), 1, fp);
printf("%d %s %d",grd.stu_id, grd.name,grd.math);
}
}
}
这样没有错误,它会输出4组数据
但是,如果我们不知道文件中有几组st_grade类型的数据
而要把文件中所有数据都输出,将上面程序的
{for(i=1; i<=4; i++)
{ fread(&grd, sizeof(struct st_grade), 1, fp);
printf("%d %s %d",grd.stu_id, grd.name,grd.math);
}
}
改为
{ i=1;
while(!feof(fp))
{fread(&grd, sizeof(struct st_grade), 1, fp);
printf("%d %s %d",grd.stu_id, grd.name,grd.math);
i++;
}
}
便会多输出一组无效数据,while循环执行5次
运行上述程序,如果我们输入:
1002 tom 67
1003 mary 78
1001 jack 99
2000 peter 81
按任意键后,输出为:
1002 tom 67
1003 mary 78
1001 jack 99
2000 peter 81
28282 -228 -222
第五组输出是类似于 28282 -228 -222的乱码,用单步执行,
while循环执行五次,难道是循环条件不对?恳请各位指教!谢谢!
 
1.我总觉得有点不对。
main()
{
.........
struct st_grade grd_info[4]; struct st_grade grd[4];
~~~~~~~~~~~
....
for(i=1; i<=4; i++)
~~~~~~~~~~~~~~~~~不是(i=0;i<4;i++)?
.....

}

{
i=1;
~~~不是i=0?
while(!feof(fp))
{
fread(&grd, sizeof(struct st_grade), 1, fp);
printf("%d %s %d",grd.stu_id, grd.name,grd.math);
i++;
}
}
2.
把 fread(&grd, sizeof(struct st_grade), 1, fp);
改成
if(fread(&grd, sizeof(struct st_grade), 1, fp)==sizeof(struct st_grade))试试
或在前加if(!feof(fp)调试一下。
 
老大们, if( (fp=fopen("stu.txt","w"))==NULL ) 是文本模式,应当使用
if( (fp=fopen("stu.txt","wb"))==NULL ) 对 struct 进行操作!!!!!
你这个程序没有崩溃已经是老天眷顾你了。
好好看 C 语言的书吧。
 
>>通过C的写文件函数fwrite向文本文件stu.txt写入四组stud_grade类型的数据,
如果想做到这一点,使用 fscanf fprintf,利用 fscanf 返回的整数判断是否到达文件末尾。
我刚才的答案也是正确的。
 
接受答案了.
 
后退
顶部