[英]How to save the data which i read in an array from a file in C
所以在做這個任務的時候我遇到了一個問題,我試圖在一個數組中保存一些值(浮點數),以便我可以在以后生成圖形時使用它們,但我在這里遇到的問題是我讀取的值和我可以打印它們,但后來我檢查了數組,存儲的數字不一樣。
我試圖在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'時它會忽略,因為它不是有效數據(在數據表中)
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) { … }
塊后面來糾正此問題。 printf("Fuer %i - %i Werte - Durchschnitt %.2f °C\\n", oldyear, cnt-1, last);
使用cnt-1
printf("Fuer %i - %i Werte - Durchschnitt %.2f °C\\n", oldyear, cnt-1, last);
,但正確的只是cnt
。 for(int i=0;i<125;i++)
的循環也應該使用存儲元素的實際數量l
,而不是125
。 avg[]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.