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

Why my code is printing last values retrieved from file instead of new one

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

而不是像这样:

尽管我正在调用相同的打印函数。我们正在记录 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[], struct calc c[], 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[], struct calc c[], 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] = '[=10=]';
        fscanf(f, "%f %f %f %f\n", &s[i].hoursWorked, &s[i].hourlyRate, &s[i].federalTax, &s[i].stateTax);
        fscanf(f, "%.2f %.2f %.2f %.2f\n", &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[], int n)
{
    FILE *f;
    f = fopen("employee.bin", "rb");

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

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

    savebin(st, 4);
    retrievebin(st, 4);
    printf("After reading bin file");
    print(st, c, 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].grosspay, &c[i].fto, &c[i].sto, &c[i].np);

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

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

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

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