焦糖橙子 发表于 2023-3-26 13:34:21

文件输出,最后的数据打印了两次

代码功能实现学生信息的录入和输出,录入是正常的,每次最后一名学生都会被打印两次

#include<stdio.h>
#include<stdlib.h>

typedef struct student {
        char num;
        char name;
        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;       
}

isdkz 发表于 2023-3-26 13:42:39

首先,我想指出你的问题是在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;      
}


这样,你的程序应该不再打印重复的学生信息了。
页: [1]
查看完整版本: 文件输出,最后的数据打印了两次