说有一个文本文件'测量'看起来像这样:
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;我想,这仍然是空的,是由于代码末尾附近的嵌套循环中的错误造成的。我觉得必须有一种更简单,更优雅的方式来做到这一点。你会如何处理这个问题?
答案 0 :(得分:0)
您可以构建一个月份数组,其中有一个整数值,指示月份是否存在,然后对于每个citi名称,您将迭代直到城市名称在while循环中更改,从而使数组中的每个条目等于{ {1}}对于文件中的每个条目,在数组将包含缺失个月位置 - 1,1
之后,如果是,则将该值输出到文件。< / p>
这是代码
0