马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
}
这样,你的程序应该不再打印重复的学生信息了。
|