为什么我的fscanf不读取第一个字符串,而是将最后一行读入第一个字符串?

hmmo2u0o  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(267)

我是一个初学者在文件包括代码,所以请有人帮助我。这是我的代码看起来像。

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

#define first_ten_hours 7.99;
#define after_ten_hours 1.99;

double charges_all(int hour);
double charges_avg(int money, int hour_use);
double round_money(double sum);

int main()
{
    FILE *f_read, *f_write;

    f_read = fopen("usage.txt", "r");
    f_write = fopen("charges.txt", "w");

    if(f_read == NULL)
    {
        printf("Error to open the file.\n");
        return 1;
    }

    char date[2][10];
    char studenid[10][100];
    double using_hour[10];
    int current_line = 1;

    for(int i = 0; i < 11; i++)
    {
        if(current_line == 1)
        {
            fscanf(f_read, "%s %s", date[0], date[1]);
            current_line++;
        }
        else
        {
            fscanf(f_read, "%s %lf", studenid[i], &using_hour[i]);
            current_line++;
        }
    }

    current_line = 1;

    for(int i = 0; i < 11; i++)
    {
        if(current_line == 1)
        {
            printf("%s %s\n", date[0], date[1]);
            current_line++;
        }
        else
        {
            printf("%s %lf\n", studenid[i], using_hour[i]);
            current_line++;
        }
    }

    fclose(f_read);
    fclose(f_write);

    return 1;   
}

current_line = 1;之后,我打印检查并查看问题。
这是我的文本文件。

12 2022
18010 4.5
92052 3.2
01051 7.4
11052 6.3
13052 5.5
01081 2.2
65052 1.3
94052 2.8
32052 3.7
41051 4.9

这是printf循环的输出:

41051 2022
18010 4.500000
92052 3.200000
01051 7.400000
11052 6.300000
13052 5.500000
01081 2.200000
65052 1.300000
94052 2.800000
32052 3.700000
41051 4.900000

但我想要的是第一行的第一个字符串是12。

6ie5vjzr

6ie5vjzr1#

因为您编写for循环的方式(s),则您正在访问studenidusing_hour数组的元素,这些元素在这些循环的最后一次迭代中超出了界限(即,当i为10时-[10]处的元素超过用10个元素声明的数组的末尾)。这种“错误访问”导致未定义的行为,这可能包括覆盖先前读入date数组元素的值。
一个“快速修复”方法是将[i]索引(全部)更改为[i - 1]。然而,更好的方法是将第一行的读取放在循环之外,然后对接下来的10行运行这些循环:

int main()
{
    FILE* f_read, * f_write;

    f_read = fopen("usage.txt", "r");
    f_write = fopen("charges.txt", "w");

    if (f_read == NULL)
    {
        printf("Error to open the file.\n");
        return 1;
    }

    char date[2][10];
    char studenid[10][100];
    double using_hour[10];

    fscanf(f_read, "%9s %9s", date[0], date[1]); // Read first line differently
    for (int i = 0; i < 10; i++) // Run the loop ONLY 10 times ...
    {
        fscanf(f_read, "%99s %lf", studenid[i], &using_hour[i]);
    }

    printf("%s %s\n", date[0], date[1]);
    for (int i = 0; i < 10; i++)
    {
        printf("%s %lf\n", studenid[i], using_hour[i]);
    }

    fclose(f_read);
    fclose(f_write);

    return 1;
}

相关问题