从文件中检索丢失的条目

时间:2015-02-18 13:08:44

标签: c arrays nested-loops

说有一个文本文件'测量'看起来像这样:

         London     1   0.5
         London     2   1.0
          Tokyo     3   2.0
         London     6  18.4
          Tokyo    11  -1.0
          Tokyo     1  -0.3
        Toronto     3  -1.0
         London     8   8.0
        Toronto    11  11.0
        Toronto    12  10.4
         London     7  -5.6

第一栏存储城市的地方'名称,第二个表示测量发生的月份,第三个表示给定城市中该月的平均温度。现在,我想要的是阅读所有这些数据,并找出一个城市没有条目的几个月(例如伦敦3,东京6等),并将所有这些都放在文本文件中,称为' errors& #39 ;. 这是我尝试的方式,但最终被卡住了:

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

struct City {
    char name[20];
    int month;
    float avg;

};

int scan(struct City *arr, int len)
{
    FILE *fp = fopen("measurements.txt", "r");
    if (fp == NULL) {
        printf("Error while reading.");
        exit(1);
    }
    int i = 0;
    while ((fscanf(fp,"%12s%d%f\n", arr[i].name, &arr[i].month, &arr[i].avg)) == 3)
        i++;
    fclose(fp);
    return i;
}

void sort(struct City *arr, int len)
{
    struct City temp[100];
    int         i, j;

    for (i = 0 ; i < len - 1 ; i++) {
        for (j = i + 1 ; j < len; j++) {
            int compare = strcmp(arr[i].name, arr[j].name);
            if (compare > 0) {
                temp[i] = arr[i];
                arr[i]  = arr[j];
                arr[j]  = temp[i];
            }
        }
    }

}

int main()
{
    struct City array[100];
    int len = scan(array,1000);
    sort(array, len);

    FILE *fout;

    fout = fopen("missing.txt","w");
    if (fout == NULL) {
        printf("Error while printing");
        exit(1);
    }

    int i;
    for (i = 1 ; i < len ; i++) {
        int j, m = 1, found = 0;
        for (j = 1 ; j <= 12 ; j++) {
            while (strcmp(array[m - 1].name, array[m].name) == 0) {
                if (array[m - 1].month == j)
                    found=1;
            }
            if (found == 0)
                fprintf(fout,"%15s %d",array[i].name, j);
        }
    }
    fclose(fout);
    return 0;
}

但是,当我运行此程序时,文件&#39;输出&#39;我想,这仍然是空的,是由于代码末尾附近的嵌套循环中的错误造成的。我觉得必须有一种更简单,更优雅的方式来做到这一点。你会如何处理这个问题?

1 个答案:

答案 0 :(得分:0)

您可以构建一个月份数组,其中有一个整数值,指示月份是否存在,然后对于每个citi名称,您将迭代直到城市名称在while循环中更改,从而使数组中的每个条目等于{ {1}}对于文件中的每个条目,在数组将包含缺失个月位置 - 1,1之后,如果是,则将该值输出到文件。< / p>

这是代码

0