简体   繁体   中英

How do you allocate memory when reading from a file for a dma struct in a struct array in c

So I have a map which consists of an array of structs which look like this


//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

Once I get to the reading the file part tho it seems as if I would need to declair memory for the items that will be stored in the tiles. As this would not be a set number as I mentioned in my code how would I go about this?

Any alternative aproaches to this process are welcome. Thanks!

The map data needs to be serialized when written to the file, and deserialized when read back from the file. One way to do that is:

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);
    }
}

Error checking has been omitted for clarity.

Reading is similar to writing, but will require memory to be allocated:

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);
    }
}

Again, error checking has been omitted for clarity.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM