Как вы выделяете память при чтении из файла для структуры dma в массиве структур в c - PullRequest
1 голос
/ 08 июля 2020

Итак, у меня есть карта, которая состоит из массива структур, которые выглядят так


//Header files
#include <string.h>
#include <stdlib.h>
#include <dirent.h>

//Symbolic names
#define mapSize 301

//This struct will be used to store item data in the map
struct mapItem
{
    char name[21];
    short id;
    short type;
    short amount;
}; //End mapItem

//This struct will be used for map generation and storage
struct tile
{
    char name[21];
    short id;
    char description[100];
    short itemAmount;
    struct mapItem *item;
}; //End tile struct

//This struct variable is the map
struct tile map[mapSize][mapSize];

//Function signatures
void itemGen();

int main()
{
    
    char str[4];
    FILE *characterF, *inventoryF, *mapF;

    itemGen();

    //Opens map file
    /*Example file path is C:\*/
    strcpy(str, "C:\");
    mapF = fopen(str, "w");

    //writes map to file
    fwrite(map, sizeof(struct tile), (mapSize*mapSize), mapF);

    //Closes file
    fclose(mapF);

    /*This would not usually be streight after the file had been written to
    //Opens file
    mapF = fopen(str, "w");

    

    //Reads from file
    fread(map, sizeof(struct tile), mapSize*mapSize, mapF);

    return 0;
} //End main


/*This is just an example in the actual program the itemAmount is not always 3*/
void itemGen()
{

    short x, y;
    x = y  = 100;

    //Sets value of itemAmount for example
    map[y][x].itemAmount = 3;

    //Allocates 3 structs in memory
    map[y][x].item = (struct mapItem *)calloc(map[y][x].itemAmount, sizeof(struct mapItem));

    //This will add 3 items to the tile
    strcpy((map[y][x].item+0)->name, "Apple");
    strcpy((map[y][x].item+1)->name, "Bag");
strcpy((map[y][x].item+1)->name, "Bag");

} //End itemGen

Как только я перейду к чтению части файла, мне кажется, что мне нужно объявить память для предметы, которые будут храниться в плитках. Поскольку это не будет установленным числом, как я упоминал в своем коде, как я могу go по этому поводу?

Любые альтернативные подходы к этому процессу приветствуются. Спасибо!

1 Ответ

1 голос
/ 08 июля 2020

Данные карты должны быть сериализованы при записи в файл и десериализованы при обратном чтении из файла. Один из способов сделать это:

for (int y = 0; y < mapSize; y++) {
    for (int x = 0; x < mapSize; y++) {
        fwrite(&map[y][x], offsetof(struct tile, item), 1, mapF);
        fwrite(map[y][x].item, sizeof(struct mapItem), map[y][x].itemAmount, mapF);
    }
}

Проверка ошибок опущена для ясности.

Чтение похоже на запись, но требует выделения памяти:

for (int y = 0; y < mapSize; y++) {
    for (int x = 0; x < mapSize; y++) {
        fread(&map[y][x], offsetof(struct tile, item), 1, mapF);
        map[y][x].item = calloc(map[y][x].itemAmount, sizeof(struct mapItem));
        fread(map[y][x].item, sizeof(struct mapItem), map[y][x].itemAmount, mapF);
    }
}

Опять же, для ясности опущена проверка ошибок.

...