我有三个结构:
struct Map
{
int width, height;
int* cases;
};
typedef struct Map Map;
struct Ship
{
int x, y, length, firstShoot, color, hasBeenDiscovered;
};
typedef struct Ship Ship;
struct Player
{
int activeShips;
Map map[2];
char lastMoves[5][128];
Ship ships[10];
int shipcolor[4];
int color;
};
typedef struct Player Player;
我将地图结构用作2d动态数组。以下是我操作地图的功能:
void mallocMap(Map* map, int width, int height)
{
map->cases = malloc(sizeof(int) * width * height);
map->width = width;
map->height = height;
if (map->cases == NULL)
{
printf("Erreur d'allocation de memoire\n");
exit(0);
}
}
void freeMap(Map* map)
{
free(map->cases);
}
int getMapValue(Map map, int x, int y)
{
return *(map.cases + y*map.width + x);
}
void setMapValue(Map* map, int value, int x, int y)
{
*(map->cases + y*map->width + x) = value;
}
现在我正在做的是创建一个Player类型的变量播放器,询问用户地图的宽度和高度,并为地图分配内存(malloc(sizeof(int)*width*height)
)。
接下来我想要做的是能够将struct Player存储在一个文件和案例的值中,但我不知道如何做到这一点。
有什么建议吗?
答案 0 :(得分:2)
您没有正确阅读这些值:
fseek(file, sizeof(Player), SEEK_SET); // set the cursor after the struct
fread(&player->games, sizeof(int), 1, file); // read the value
fseek(file, sizeof(int), SEEK_CUR); // set the cursor after the first value
fread(&player->map.cases, sizeof(int), 1, file); // read the value
在第一次阅读中,您传入&player->games
作为要写入的地址。此表达式的类型为int **
。您可以写入包含该地址的指针,而不是写入您分配的内存。另一个读法存在同样的问题。
从每个fread
调用中删除address-of运算符。此外,对fseek
的调用是多余的,因为文件指针已经在正确的位置,因此您可以删除它们。
fread(player->games, sizeof(int), 1, file); // read the value
fread(player->map.cases, sizeof(int), 1, file); // read the value