|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
代码功能实现学生信息的录入和输出,录入是正常的,每次最后一名学生都会被打印两次
- #include<stdio.h>
- #include<stdlib.h>
- typedef struct student {
- char num[10];
- char name[10];
- int age;
- double spec1;
- double spec2;
- double foreign;
- double total;
- } stu;
- void WriteToFile();
- void ReadFromFile();
- int main() {
- int flag;
- do {
- printf("1.录入成绩 2.输出成绩 0.退出程序\n");
- printf("请输入要执行的操作:");
- scanf("%d",&flag);
- switch(flag) {
- case 1:
- WriteToFile();
- break;
- case 2:
- ReadFromFile();
- break;
- default:
- printf("退出程序!");
- break;
- }
- } while(flag == 1||flag == 2);
- return 0;
- }
- void WriteToFile()
- {
- FILE *fp;
- stu a;
- char flag = 'y';
- fp = fopen("student.txt","w");
- if(fp == NULL)
- {
- printf("文件打开失败!\n");
- exit(1);
- }
- while(flag == 'y'||flag == 'Y')
- {
- printf("请输入考生考号:");
- scanf("%s",a.num);
- printf("请输入考生姓名:");
- scanf("%s",a.name);
- printf("请输入考生外语成绩:");
- scanf("%lf",&a.foreign);
- printf("请输入考生专业课1成绩:");
- scanf("%lf",&a.spec1);
- printf("请输入考生专业课2成绩:");
- scanf("%lf",&a.spec2);
- a.total = a.foreign + a.spec1 + a.spec2;
- fprintf(fp,"%10s%10s%8.2f",a.num,a.name,a.foreign);
- fprintf(fp,"%8.2f%8.2f%8.2f\n",a.spec1,a.spec2,a.total);
- fflush(stdin);
- printf("继续输入吗?继续请输入y或Y:");
- scanf("%c",&flag);
- }
- fclose(fp);
- return;
- }
- void ReadFromFile()
- {
- FILE *fp = NULL;
- stu a;
- fp = fopen("student.txt","r");
- if(fp == NULL)
- {
- printf("文件打开失败!\n");
- exit(1);
- }
- printf("学生姓名 总分\n");
- while(!feof(fp))
- {
- fscanf(fp,"%s%s",&a.num,&a.name);
- fscanf(fp,"%lf%lf%lf%lf",&a.foreign,&a.spec1,&a.spec2,&a.total);
- printf("%10s%8.2f\n",a.name,a.total);
- }
- fclose(fp);
- return;
- }
复制代码
首先,我想指出你的问题是在ReadFromFile()函数中。这个问题是由于使用feof(fp)作为循环条件导致的,因为feof()函数在文件结束之前不会返回非零值,但是当从文件读取数据时,它已经到达了文件末尾。因此,在循环中的最后一次迭代,你将看到重复的数据。
为了解决这个问题,你可以修改ReadFromFile()函数中的循环条件,检查fscanf()函数的返回值是否等于预期的读取数据数量。如果返回值与预期读取的数据数量相等,说明文件中仍有数据可读。
以下是修改后的ReadFromFile()函数:
- void ReadFromFile()
- {
- FILE *fp = NULL;
- stu a;
- int ret;
- fp = fopen("student.txt","r");
- if(fp == NULL)
- {
- printf("文件打开失败!\n");
- exit(1);
- }
- printf("学生姓名 总分\n");
- while((ret = fscanf(fp,"%s%s%lf%lf%lf%lf",a.num,a.name,&a.foreign,&a.spec1,&a.spec2,&a.total)) == 6)
- {
- printf("%10s%8.2f\n",a.name,a.total);
- }
- fclose(fp);
- return;
- }
复制代码
这样,你的程序应该不再打印重复的学生信息了。
|
|