1

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!

1
  • 1
    The data structure stored in the file should not have pointers. Instead of storing the struct mapItem *item member in the file, store the item[0], item[1], ..., item[itemAmount-1] elements instead. One term for this is "flattening" the data, also known as "serializing" the data. Commented Jul 8, 2020 at 19:35

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.