簡體   English   中英

如何在C中存儲從文件讀取的結構?

[英]How do I store structures that are read from a file in C?

我想出了一個學習C語言的項目,但是我碰到了很多困難。 該項目只是一個紙牌游戲,玩家擁有兩套紙牌,一套是一定尺寸的套牌,另一套是他們收集的紙牌,數量可以根據需要而定。 卡結構如下:

struct card {   
    char name[256];
    char special[256];
    char type[100];
    char rarity[100];
    int points;
};

然后,我有一個名為coll.txt的集合文件。

first card goes here 50
second card goes here 70
...

然后,我有一個(草率)函數,該函數從文件讀取並將其存儲到臨時卡中:

void read_into_collection(FILE *f) {
    char *file_text;
    char *token;
    int i;
    struct card temp;

    file_text = (char *) malloc(sizeof(struct card));

    while(fgets(file_text, sizeof(struct card), f)) {
        for(i = 1, token = strtok(file_text, " "); token; i++, token = strtok(NULL, " ")) {
            switch (i) {
            case 1:
                strcpy(temp.name, token);
                break;
            case 2:
                strcpy(temp.special, token);
                break;
            case 3:
                strcpy(temp.type, token);
                break;
            case 4:
                strcpy(temp.rarity, token);
                break;
            case 5:
                temp.points = atoi(token);
                break;
            default:

                i = 0;
                break;
            }
        }
    }


    free(file_text);
}

因此,當i = 6我准備將臨時卡移到集合中,並將下一張卡讀入temp變量,依此類推。 但是我該怎么做呢? 我在弄清楚實際應該收集什么時遇到了麻煩。 起初我以為:

struct card *collection = (struct card *) malloc(number_of_cards * sizeof(struct card));

但是,如果我是對的,則malloc()返回指向大塊內存的指針,並且該內存不是像數組那樣順序的,因此我無法遞增該指針來存儲卡。

我還嘗試計算文件中的行數(每行是一張卡),然后制作該大小的數組,但是我得到一個錯誤,指出該值不是常數。

將這些卡存儲為收藏的最佳方法是什么? 我只是將集合做成一個很大的數組,但是我覺得這種情況經常出現在項目中,寧願學習如何處理它,也不要輕易走開。

但是,如果我是對的,則malloc()返回指向大塊內存的指針,並且該內存不是像數組那樣順序的,因此我無法遞增該指針來存儲卡。

假。 它是順序的。 您可以使用malloc()創建任何數組:

mystruct* ptr = (mystruct*) malloc(sizeof(mystruct) * numberOfStructs)

for(int i = 0; i < numberOfStructs, i++) {
    ptr[i].setSomeInfo(x);
}

這是用C語言完成的標准方法。

我以前經常用C編程,這是我的最愛之一。 這是我的答案。

您使用malloc的方式確實分配了一個數組

struct card *collection = (struct card *) malloc(number_of_cards * sizeof(struct card));

每次對malloc的調用都會返回一個指向內存中不同區域的指針。 但是,一次調用malloc總是返回一個連續的塊。

如果知道卡數,則可以使用它來分配一個數組,然后像這樣訪問它

//added some code to prevent overflow
collection[i].name[255] = 0;
strncpy(collection[i] .name, token, 255);

如果卡數未知,該怎么辦。 然后做一個鏈表。 這是鏈表的主要用途,用於存儲大小未知的集合的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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