从文件中读取 c 中结构数组中的 dma 结构时如何分配内存
How do you allocate memory when reading from a file for a dma struct in a struct array in c
所以我有一个映射,它由一组结构组成,如下所示
//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
一旦我开始读取文件部分,似乎我需要为将存储在图块中的项目声明内存。因为这不是我在代码中提到的固定数字,我该如何处理?
欢迎使用此过程的任何替代方法。
谢谢!
地图数据写入文件时需要序列化,从文件读回时需要反序列化。一种方法是:
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);
}
}
同样,为清楚起见,省略了错误检查。
所以我有一个映射,它由一组结构组成,如下所示
//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
一旦我开始读取文件部分,似乎我需要为将存储在图块中的项目声明内存。因为这不是我在代码中提到的固定数字,我该如何处理?
欢迎使用此过程的任何替代方法。 谢谢!
地图数据写入文件时需要序列化,从文件读回时需要反序列化。一种方法是:
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);
}
}
同样,为清楚起见,省略了错误检查。