如何保存我从 C 中的文件中读取的数组中的数据
Posted
技术标签:
【中文标题】如何保存我从 C 中的文件中读取的数组中的数据【英文标题】:How to save the data which i read in an array from a file in C 【发布时间】:2016-12-10 22:44:19 【问题描述】:因此,在执行此任务时,我遇到了一个问题,我试图将一组值(浮点数)保存在一个数组中,以便以后可以在生成图形时使用它们,但我在这里面临的问题是我阅读这些值,我可以打印它们,但后来我检查了数组,存储在那里的数字不一样。
我正在尝试保存在 avg[] 中。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
float maximum(float array[])
float max=0;
for(int i=0;i<100;i++)
if (array[i]>max)
max=array[i];
return max;
float minimum(float array[])
float min=0;
for(int i=0;i<100;i++)
if (array[i]<min)
min=array[i];
return min;
char * read(char *filename)
FILE * sample;
sample = fopen(filename,"r"); //like file open in notepad ,which file? and what to do?
int count = 0;
static char singleline[100];
int cnt = 0;
int sum = 0;
int oldyear = -1;
float avg[82];
while(!feof(sample)) //read that until end.
count++;
fgets(singleline,150,sample);
if (count>21 && singleline[33]!='9')
char y[5], t[6];
for (int i = 14; i < 18; i++)
y[i - 14] = singleline[i];
y[4]='\0';
for (int i= 24;i <29;i++)
t[i-24]=singleline[i];
t[5]='\0';
int year = atoi(y);
int temp = atoi(t);
//printf("year : %i ,temp: %i\n",year, temp);
if (year == oldyear)
cnt++;
sum += temp;
else
int l=0;
l++;
avg[l] = 0.1 * sum / cnt;
if (cnt != 0)
printf("Fuer %i - %i Werte - Durchschnitt %.2f °C\n", oldyear, cnt, avg[l]);
cnt = 1;
sum = temp;
//save[l]=avg;
oldyear = year;
float last = 0.1 * sum / cnt;
printf("Fuer %i - %i Werte - Durchschnitt %.2f °C\n", oldyear, cnt-1, last);
fclose(sample);
//for(int i=0;i<)
for(int i=0;i<125;i++)
printf("%f\n",avg[i]);
printf("\nMax Temp= %f",maximum(avg));
printf("\nMax Temp= %f",minimum(avg));
return singleline;
int main()
char * file1 = "TG_STAID000476.txt";
read(file1);
//char * file2 = "TG_STAID000179.txt";
//read(file2);
return 0;
所以是的,问题是读取年份和相应的值并形成该特定年份的平均值,然后在图表中表示它。
我可以在第一部分使用平均值,但是当我稍后尝试使用它时,它存储了错误的值,你可以看到我尝试打印 avg[] 的所有值的地方,可以吗?请帮我弄清楚如何纠正错误,我希望将它们保存为浮点数。
作业数据表在这里。 https://www.scribd.com/document/333844245/TG-STAID000179
我尝试读取这些值并使用 atoi 保存它们,然后使用它们来获取平均值,我使用 Count>21 因为它们之前的文本不是必需的,当它在第 34 列读取“9”时,它忽略,因为它不是有效数据(在数据表中)
【问题讨论】:
如果结果是 avg 为什么返回 singleLine? 其实这个函数并没有返回任何我想的东西,起初当我使用该方法读取完整行并打印它时,我使用了返回单行,但后来我意识到我不需要它,我实际上找出错误在哪里,我在循环中分配了 l=0,它重置了值:D,但现在我不知道如何将其余的数组值保留为 null。while (!feof(file))
is always wrong。在使用它读取的“行”之前,您需要检查来自fgets()
的返回值以判断它是否遇到 EOF。
欢迎来到 Stack Overflow。请尽快阅读About 和How to Ask 页面。更紧急的是,请生成一个 MCVE (minimal reproducible example)。没有明确的证据表明数据在之前和之后打印的位置以及值发生了变化。请包括重现问题的最小数据集。显示正确的输出。如果“它不同”是最重要的,那么展示你应该得到的两次可能就足够了。一个可能的问题原因是在数组超出范围后尝试访问它。不过,我不确定您将值存储在哪里。
fgets(singleline,150,sample);
--> fgets(singleline,100,sample);
【参考方案1】:
-
变量
l
,用于计算计算的年份温度平均值,在处理年份变化的块中定义和初始化,因此始终重置为零。通过将定义移到行读取循环之外来纠正这个问题,甚至可能在全局范围内(参见 2.)。
maximum()
和 minimum()
函数在 array
元素 0 到 99 上运行,而不管传递的参数定义为 avg[82]
并且末尾的某些元素未初始化。通过使用存储元素的实际数量l
来更正此问题,作为全局范围变量或附加函数参数。
singleline
缓冲区太短,因此会溢出。
while(!feof(sample))
循环在读取最后一行后额外循环一次,因为在下一个 fgets()
之前无法识别 EOF。通过使用 fgets()
的返回值来测试 EOF 来更正此问题。
即使cnt
为零,也会评估avg[l] = 0.1 * sum / cnt
。通过将此表达式移动到 if (cnt != 0) …
块内(也是 l++
,但在 printf()
后面)来更正此问题。
如果cnt
为零,则不执行cnt = 1
。这会导致不计算第一个数据点。通过将此表达式移到 if (cnt != 0) …
块后面来更正此问题。
额外的循环周期(参见 4.)可能导致在最终的 printf("Fuer %i - %i Werte - Durchschnitt %.2f °C\n", oldyear, cnt-1, last);
中使用 cnt-1
,但正确的是 cnt
。
循环for(int i=0;i<125;i++)
也应该使用实际存储元素的数量l
,而不是125
。
需要注意的是,最后一年的平均值(可能是有意的)未存储在 avg[]
中。
【讨论】:
以上是关于如何保存我从 C 中的文件中读取的数组中的数据的主要内容,如果未能解决你的问题,请参考以下文章