簡體   English   中英

使用 c 編程將文件中的行放入二維數組

[英]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 ,因為您不能sprintffloat 相反,您似乎希望每個元素都是一個字符串。

如果您希望 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM