C 从文件中检索缺少的条目
假设有一个文本文件“Measures”如下所示:C 从文件中检索缺少的条目,c,arrays,nested-loops,C,Arrays,Nested Loops,假设有一个文本文件“Measures”如下所示: 伦敦10.5 伦敦2.1.0 东京32.0 伦敦6 18.4 东京11-1.0 东京1-0.3 多伦多3-1.0 伦敦8.0 多伦多11.0 多伦多1210.4 伦敦7-5.6 其中第一列存储城市名称,第二列表示测量发生的月份,第三列只是给定城市当月的平均温度。现在,我想要的是读取所有这些数据,并找出某个城市(例如伦敦3号、东京6号等)在哪个月内没有条目,然后将所有这些都放在名为“错误”的文本文件中。 我是这样尝试的,但最终还是被卡住了:
伦敦10.5
伦敦2.1.0
东京32.0
伦敦6 18.4
东京11-1.0
东京1-0.3
多伦多3-1.0
伦敦8.0
多伦多11.0
多伦多1210.4
伦敦7-5.6
其中第一列存储城市名称,第二列表示测量发生的月份,第三列只是给定城市当月的平均温度。现在,我想要的是读取所有这些数据,并找出某个城市(例如伦敦3号、东京6号等)在哪个月内没有条目,然后将所有这些都放在名为“错误”的文本文件中。
我是这样尝试的,但最终还是被卡住了:
#包括
#包括
#包括
结构城市{
字符名[20];
整月;
浮动平均值;
};
内部扫描(结构城市*arr,内部透镜)
{
文件*fp=fopen(“measurements.txt”、“r”);
如果(fp==NULL){
printf(“读取时出错”);
出口(1);
}
int i=0;
而((fscanf(fp,“%12s%d%f\n”,arr[i].name,&arr[i].month,&arr[i].avg))==3)
i++;
fclose(fp);
返回i;
}
无效排序(结构城市*arr,整数长度)
{
结构城市温度[100];
int i,j;
对于(i=0;i0){
温度[i]=arr[i];
arr[i]=arr[j];
arr[j]=温度[i];
}
}
}
}
int main()
{
结构城市数组[100];
int len=扫描(阵列,1000);
排序(数组,len);
文件*fout;
fout=fopen(“missing.txt”,“w”);
如果(fout==NULL){
printf(“打印时出错”);
出口(1);
}
int i;
对于(i=1;i 对于(j=1;j您可以构建一个月数组,该数组将具有一个整数值,指示该月是否存在,然后对每个花旗名称进行迭代,直到城市名称在while循环中更改,使数组中的每个条目等于文件中每个条目的1
,该数组将包含缺少的月份位置-1,a0
,因此如果它不存在,则将该值输出到文件
这是密码
#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");
int i = 0;
if (fp == NULL) {
printf("Error while reading.");
exit(1);
}
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];
FILE *fout;
int len;
const char *previous;
int month;
len = scan(array, 100);
if (len == 0)
return -1;
sort(array, len);
fout = fopen("missing.txt","w");
if (fout == NULL) {
printf("Error while printing");
return -1;
}
previous = NULL;
month = 1;
for (int i = 0 ; i < len ; i++) {
int months[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
previous = array[i].name;
while (strcmp(previous, array[i].name) == 0)
{
int month;
month = array[i].month;
if ((month >= 0) && (month < 12))
months[month - 1] = 1;
i += 1;
}
i -= 1;
for (int j = 0 ; j < 12 ; j++)
{
if (months[j] != 0)
continue;
fprintf(fout, "%15s%5d\n", previous, j + 1);
}
}
fclose(fout);
return 0;
}
#包括
#包括
#包括
结构城市{
字符名[20];
整月;
浮动平均值;
};
内部扫描(结构城市*arr,内部透镜)
{
文件*fp=fopen(“measurements.txt”、“r”);
int i=0;
如果(fp==NULL){
printf(“读取时出错”);
出口(1);
}
而((fscanf(fp,“%12s%d%f\n”,arr[i].name,&arr[i].month,&arr[i].avg))==3)
i++;
fclose(fp);
返回i;
}
无效排序(结构城市*arr,整数长度)
{
结构城市温度[100];
int i,j;
对于(i=0;i0){
温度[i]=arr[i];
arr[i]=arr[j];
arr[j]=温度[i];
}
}
}
}
int main()
{
结构城市数组[100];
文件*fout;
内伦;
常量字符*先前;
整月;
len=扫描(阵列,100);
如果(len==0)
返回-1;
排序(数组,len);
fout=fopen(“missing.txt”,“w”);
如果(fout==NULL){
printf(“打印时出错”);
返回-1;
}
previous=NULL;
月=1;
对于(int i=0;i=0)和&(月<12))
月份[月份-1]=1;
i+=1;
}
i-=1;
对于(int j=0;j<12;j++)
{
如果(月[j]!=0)
继续;
fprintf(fout,“%15s%5d\n”,先前,j+1);
}
}
fclose(fout);
返回0;
}
你为什么不使用SQL?为什么重新编辑代码?你添加了什么吗?还要使用更多的空格以使代码清晰易读,编译器无论如何都会忽略它们。不,我只是更正了语法错误。感谢你的编辑。小心,你试图访问数组之外的内容:数组[m-1]当m==0时。这可能就是你找不到匹配项的原因。捕捉得好。但这似乎并不能解决问题,它会打印所有月份的数据。