C の学習に取り組むプロジェクトを思いついたのですが、ちょっとした壁にぶつかりました。このプロジェクトは、プレイヤーが 2 セットのカードを持っている単純なカード ゲームです。1 セットはセット サイズのデッキで、もう 1 セットは必要なだけ大きくできるカードのコレクションです。カードの構造は次のとおりです。
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
、一時カードをコレクションに移動し、次のカードを一時変数に読み込む準備が整うまでに. しかし、どうすればこれを行うことができますか?コレクションが実際にどうあるべきかを理解するのに苦労しています。最初に私は考えました:
struct card *collection = (struct card *) malloc(number_of_cards * sizeof(struct card));
しかし、私が正しければ、malloc()
メモリのチャンクへのポインタを返し、メモリは配列のように連続していないため、ポインタをインクリメントしてカードを保存することはできません。
また、ファイル内の行数 (各行はカード) を数えてから、そのサイズの配列を作成しようとしましたが、値が定数ではないというエラーが発生します。
これらのカードをコレクションとして保管する最良の方法は何ですか? コレクションを非常に大きな配列にするだけですが、この状況はプロジェクトで頻繁に発生するように感じ、簡単な方法を取るよりもむしろそれを処理する方法を学びたいと思います.