[英]putting lines from a file into a two dimensional array using c programming
我有一個包含幾行的文件,如下所示:
-180 -90 56 67
-179 -90 56 99
-178 -90 56 99
...
180 -90 45 45
-180 -89 45 45
每行的前兩列分別是經度和緯度值。 現在我想要做的是將這些行放在一個名為 filearray[i][j] 的二維數組中,其中 i 是經度索引,j 是緯度索引。 以下是我的嘗試:
int main(int argc, char *argv[])
{
FILE *fp=NULL;
FILE FILEOUT[150];
char inpFname[81],FILEOUT[150];
char buf[8000];
char* filearray = malloc(sizeof(float) * (159*360));
int i,j;
int date = atoi(argv[1]);
sprintf(inpFname,"global_20%d.test.out",date);
if ((fp=fopen(inpFname,"rt"))==NULL)
{
printf("\nERROR: Cannot open/read input file [%s]\n\n",inpFname);
exit(1);
}
i=0;
j=0;
while(fgets(buf,sizeof buf, fp))
{
if( i >= 359 )
{
i=0;
j=j+1;
}
sprintf(filearray[i][j],"%s",buf);
i=i+1;
}
}
但是,在編譯程序時,我收到以下錯誤:
translate_ww3file.c:34:23: error: subscripted value is neither array nor pointer nor vector
sprintf(filearray[i][j],"%s",buf);
如何調整此代碼以便獲得所需的結果?
線
char* filearray = malloc(sizeof(float) * (159*360));
是錯誤的,有幾個原因:
在該行中,您為 159*360 類型的float
元素分配空間。 但是,您將該空間分配給char *
。 這根本不符合邏輯。 如果 2D 數組中的每個元素都應該是float
,那么您應該改為:
float (*filearray)[159] = malloc( sizeof(float) * (360*159) );
在上面的行中,有必要寫float (*filearray)[159]
而不是float *filearray[159]
,因為后者聲明了一個包含 159 個元素的數組,其中每個元素都是一個float*
,而前者聲明了一個指向一個包含 159 個元素的數組的指針,其中每個元素都是一個float
。
此外,數字159
似乎是錯誤的。 如果緯度是介於-90
和+90
之間的數字,則有181
個可能的數字,因此您應該使用數字181
而不是159
。 出於同樣的原因,您可能應該使用數字361
而不是360
作為經度。
但是,稍后在您的程序中,您使用以下行:
sprintf(filearray[i][j],"%s",buf);
這意味着您不希望 2D 數組的每個元素都是float
,因為您不能sprintf
到float
。 相反,您似乎希望每個元素都是一個字符串。
如果您希望 2D 數組的每個元素都是字符串,那么您必須為每個字符串分配足夠的空間。 簡單地為每個字符串分配sizeof(float)
字節是不夠的。
由於每行中經度和緯度后面的兩個數字似乎是整數,因此可能適合讓二維數組的每個元素將這兩個數字存儲為一對int
,而不是使用字符串。 您可以定義以下類型:
struct pair
{
int number1;
int number2;
};
然后你可以像這樣定義你的二維數組:
struct pair (*filearray)[181] = malloc( sizeof(struct pair) * (361*181) );
還值得注意的是,當您不再需要 memory 時(在這種情況下,在程序結束時),為每個malloc
調用free
調用是一種很好的編程習慣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.