为什么我的代码打印从文件中检索到的最后一个值而不是新值

问题描述

我有以下代码用于读取 C 中的文件。它正在从文件中读取,但不像它应该的那样。它显示如下:

current output

而不是这样:

correct output

虽然我调用了相同的打印函数。我们正在记录 4 名员工。我知道这是一个逻辑错误,但我无法解决

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

struct employee {
    float hoursWorked,hourlyRate,federalTax,stateTax;
    char name[20];
};

struct calc
{
    float grosspay,fto,sto,np;

};

void print(struct employee s[],struct calc c[],int n)
{
    for (int i = 0; i < 4; i++)
    {
        printf("\n%s's gross pay: $%.02f\n",s[i].name,c[i].grosspay);
        printf("Federal tax owed: $%.02f\n",c[i].fto);
        printf("State tax owed: $%.02f\n",c[i].sto);
        printf("Net pay: $%.02f \n\n",c[i].np);
        printf("\n");
    }
}


void savetext(struct employee s[],int n)
{
    FILE *f;
    f = fopen("employee.txt","w");
    for (int i = 0; i < n; i++)
    {
        fprintf(f,"%s\n",s[i].name);
        fprintf(f,"%f %f %f %f\n",s[i].hoursWorked,s[i].hourlyRate,s[i].federalTax,s[i].stateTax);
        fprintf(f,"%.2f %.2f %.2f %.2f\n",c[i].grosspay,c[i].fto,c[i].sto,c[i].np);
    }
    fclose(f);
}

void retrievetext(struct employee s[],int n)
{
    FILE *f;
    int length;
    f = fopen("employee.txt","r");
    for (int i = 0; i < n; i++)
    {
        fgets(s[i].name,sizeof(s[i].name),f);
        length = (int)strlen(s[i].name);
        s[i].name[length - 1] = '\0';
        fscanf(f,&s[i].hoursWorked,&s[i].hourlyRate,&s[i].federalTax,&s[i].stateTax);
        fscanf(f,&c[i].grosspay,&c[i].fto,&c[i].sto,&c[i].np);

    }
    fclose(f);
}

void savebin(struct employee s[],int n)
{
    FILE *f;
    f = fopen("employee.bin","wb");
    for (int i = 0; i < n; i++) {
        fwrite(&s,sizeof(s[n]),n,f);
    }
    fclose(f);
}

void retrievebin(struct employee s[],"rb");

    for (int i = 0; i < n; i++) {
        fread(&s,sizeof(s[i]),f);
    }
    fclose(f);
}
int main(){

    savetext(st,c,4);
    retrievetext(st,4);
    printf("After reading text file");
    print(st,4);

    savebin(st,4);
    retrievebin(st,4);
    printf("After reading bin file");
    print(st,4);

    return 0;
}

解决方法

你在这里没有收到警告?

fscanf(f,"%.2f %.2f %.2f %.2f\n",&c[i].grosspay,&c[i].fto,&c[i].sto,&c[i].np);

fscanf() 会吃掉你扔给它的任何浮点数,像这样指定 %.2f 格式并不起作用。

https://en.wikipedia.org/wiki/Scanf_format_string

尝试像这样使用它:

fscanf(f,"%f %f %f %f\n",&c[i].np);

可能是读取文件错误,然后使用错误的行作为员工姓名。

PS:你的 print() 可能有一个小错误:

for (int i = 0; i < 4; i++) // It should probably be i < n,instead of i < 4

并尝试包含一个示例输入文件,以便人们可以测试代码。在 main(),没有 st 的定义,因此如果人们不能自己测试,就很难看到真正发生了什么。