用FILE和C语言查找最低和最高温度

时间:2019-08-24 09:10:49

标签: c

我正在尝试使此代码正常工作,但是我的编程能力还不够好,所以我认为经过这么多搜索后我应该问你。

因此,我制作了一个程序,该程序制作了一个二进制.dat文件,其中包括2个整数(日和月)和2个浮点数(一天中的最低,最高温度)。我的作业说,它需要我所做的所有输入,最低温度和最高温度,并在包括日期的情况下打印出来。我被困在分别从所有输入(最小和最大)中“搜索”。

我希望你能理解,我的英语还不够好。

我不记得我到目前为止所做的一切。但是我被困在这里。

编辑:我已经编辑了代码,使内容更清晰。

#include <stdio.h>

typedef struct {
    int day, month;
    float max_temp, min_temp;
} Date;

Date D;

int main() {
    FILE *f, *t;
    float min = D.min_temp, max = D.max_temp;
    f = fopen("Metriseis_2012.dat", "rb");

    while (!feof(f)) {
        fread(&D, sizeof(Date), 1, f);
        if ((!feof(f)) && (D.min_temp < min)) {
            fseek(f, sizeof(Date), SEEK_SET);
            printf("\nDay %d\nMonth %d\nMin_Temp %.2f\nMax_Temp %.2f\n\n", D.day, D.month, D.min_temp, D.max_temp);
        }
    }
    fclose(f);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

生成用于测试主要算法的数据

这里有一些代码可以写一个包含日期和温度值的二进制文件(写代码以读取此类数据的必要先兆):

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

typedef struct
{
    int   day;
    int   month;
    float max_temp;
    float min_temp;
} Date;

int main(void)
{
    const char filename[] = "Metriseis_2012.dat";
    FILE *fp = fopen(filename, "wb");
    if (fp == NULL)
    {
        fprintf(stderr, "Failed to open file '%s' for writing\n", filename);
        exit(EXIT_FAILURE);
    }

    for (int i = 0; i < 30; i++)
    {
        Date D =
        {
            .day = rand() % 28 + 1, .month = rand() % 12 + 1,
            .min_temp = rand() % 20,
        };

        D.max_temp = rand() % 50 + D.min_temp;
        printf("Day temperature: %6.2f - %6.2f on %.2d-%.2d\n", D.min_temp, D.max_temp, D.month, D.day);
        if (fwrite(&D, sizeof(D), 1, fp) != 1)
        {
            fprintf(stderr, "failed to write to '%s'\n", filename);
            exit(EXIT_FAILURE);
        }
    }

    fclose(fp);
    return 0;
}

数据生成代码不排除在日期中重复(实际上,日期02-0808-01在具有不同温度范围的示例数据中均重复)。解决这个问题比较困难。生成的数据未按日期顺序排序。

单独分配给D.max_temp可以避免违反C11 §6.7.9 Initialization ¶23中指定的不确定评估顺序:

  

初始化列表表达式的求值相对于彼此不确定,因此未指定发生副作用的顺序。 152)

     

152)特别地,评估顺序不必与子对象初始化的顺序相同。

您可以添加:

#include <time.h>

和(在main()的顶部):

    srand(time(0));

,因此当它被调用的频率不超过每秒一次时,它会生成不同的数字序列。种子随机数生成器还有其他更好的方法,但是它们涉及更多的代码(并且通常还包含一些平台特定的代码)。

确定最低和最高温度以及相应的日期

这里的代码读取数据并确定记录最低温度的日期(和最小值),以及记录最高温度的日期(和最大值)。

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

typedef struct
{
    int day, month;
    float max_temp, min_temp;
} Date;

int main(void)
{
    const char filename[] = "Metriseis_2012.dat";
    FILE *fp = fopen(filename, "rb");

    if (fp == NULL)
    {
        fprintf(stderr, "Failed to open file '%s' for reading\n", filename);
        exit(EXIT_FAILURE);
    }

    Date Dmin = { 0, 0, 100.0, 100.0 };
    Date Dmax = { 0, 0,   0.0,   0.0 };
    Date D;
    while (fread(&D, sizeof(Date), 1, fp) == 1)
    {
        printf("Day temperature: %6.2f - %6.2f on %.2d-%.2d\n", D.min_temp, D.max_temp, D.month, D.day);
        if (D.max_temp > Dmax.max_temp)
            Dmax = D;
        if (D.min_temp < Dmin.min_temp)
            Dmin = D;
    }
    fclose(fp);

    printf("Min temperature: %6.2f on %.2d-%.2d\n", Dmin.min_temp, Dmin.month, Dmin.day);
    printf("Max temperature: %6.2f on %.2d-%.2d\n", Dmax.max_temp, Dmax.month, Dmax.day);

    return 0;
}

在Mac上,我从阅读代码获得的输出是:

Day temperature:  13.00 -  21.00 on 02-08
Day temperature:   4.00 -  32.00 on 09-07
Day temperature:   0.00 -  15.00 on 02-16
Day temperature:   7.00 -  10.00 on 03-01
Day temperature:   0.00 -  12.00 on 02-24
Day temperature:   9.00 -  16.00 on 02-12
Day temperature:  19.00 -  47.00 on 10-09
Day temperature:  17.00 -  43.00 on 08-01
Day temperature:  10.00 -  43.00 on 08-01
Day temperature:  19.00 -  40.00 on 02-08
Day temperature:  13.00 -  49.00 on 09-28
Day temperature:   8.00 -  49.00 on 06-10
Day temperature:   1.00 -   4.00 on 02-07
Day temperature:   8.00 -  48.00 on 05-01
Day temperature:  10.00 -  13.00 on 09-17
Day temperature:   9.00 -  33.00 on 11-27
Day temperature:  17.00 -  25.00 on 02-02
Day temperature:  18.00 -  49.00 on 02-17
Day temperature:   5.00 -  19.00 on 02-20
Day temperature:   5.00 -  24.00 on 01-08
Day temperature:   9.00 -  10.00 on 11-28
Day temperature:   5.00 -   9.00 on 12-02
Day temperature:   8.00 -  31.00 on 07-04
Day temperature:  12.00 -  28.00 on 11-26
Day temperature:  18.00 -  62.00 on 10-21
Day temperature:  11.00 -  39.00 on 10-06
Day temperature:  17.00 -  64.00 on 03-14
Day temperature:   9.00 -  40.00 on 01-27
Day temperature:  15.00 -  63.00 on 04-18
Day temperature:   8.00 -  20.00 on 08-03
Min temperature:   0.00 on 02-16
Max temperature:  64.00 on 03-14

最低温度有两个输入-选择第一个。更为复杂的测试可以选择最早的日期或最晚的日期。

让生成器程序接受指定输出文件名和要生成的多个输出记录的命令行参数是明智的。分析器程序应接受指定要处理文件名的命令行参数。

答案 1 :(得分:-1)

希望以下代码可以为您提供帮助。如果您事先知道行数,将会更容易。在此示例中,我在.dat文件中使用了4行。

#include <stdio.h>
#include <malloc.h>
#include <float.h>

typedef struct {
    int day, month;
    float max_temp, min_temp;
} Date;

Date D;

int main(void) {
    int LINE_NUMBERS = 4;
    FILE *fp;
    float min = FLT_MAX;
    float max = FLT_MIN ;
    fp = fopen("Metriseis_2012.dat", "r");
    Date *t_date = malloc(sizeof(Date)*LINE_NUMBERS);
    int i = 0;
    if (fp != NULL) {
        while (i < LINE_NUMBERS) {
            fscanf(fp, "%d %d %f %f",
                   &t_date[i].day,
                   &t_date[i].month,
                   &t_date[i].max_temp,
                   &t_date[i].min_temp);
            i++;
        }
    } else {
        perror("FP ERROR: ");
    }
    for (i = 0; i < LINE_NUMBERS; i++) {
        printf("%d %d  %f %f\n",
               t_date[i].day,
               t_date[i].month,
               t_date[i].max_temp,
               t_date[i].min_temp);
        if (min > t_date[i].min_temp)
            min = t_date[i].min_temp;
        if (max < t_date[i].max_temp)
            max = t_date[i].max_temp;
    }
    fclose(fp);
    printf("max %f min %f\n", max, min);
    return 0;
}

示例.dat文件

1 2 3 4 
5 6 7 8
12 23 34 45
12 3 34 45

输出

1 2  3.000000 4.000000
5 6  7.000000 8.000000
12 23  34.000000 45.000000
12 3  34.000000 45.000000
max 34.000000 min 4.000000