鱼C论坛

 找回密码
 立即注册
查看: 1676|回复: 1

[已解决]文件输出,最后的数据打印了两次

[复制链接]
发表于 2023-3-26 13:34:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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;        
}
最佳答案
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;       
}


这样,你的程序应该不再打印重复的学生信息了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;       
}


这样,你的程序应该不再打印重复的学生信息了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 23:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表