Вы смешиваете текстовые данные и двоичные данные в своем файле данных.
Когда вы пишете имя, высоту и ширину:
fprintf(file,"%s",maze.name);
fwrite(&maze.height,sizeof(maze.height), 1, file);
fwrite(&maze.width,sizeof(maze.width), 1, file);
Это выводит последовательность символов дляза именем (скажем, «my_maze») сразу следует sizeof(int)
байт для высоты и sizeof(int)
байт для ширины. Таким образом, это 7 байтов для имени, 4 байта для высоты (при условии, что int
составляет 4 байта), и 4 байта для ширины.
Теперь, когда вы читаете назад:
fscanf(file,"%s",maze.name);
fread(&maze.height,sizeof(maze.height), 1, file);
fread(&maze.width,sizeof(maze.width), 1, file);
Спецификатор формата %s
для fscanf
читает символы, пока не встретит пробел. Первые 7 символов считываются правильно, но сразу после этого это двоичные данные для height
, так где же он перестает читать? В результате вы, скорее всего, прочитали больше байтов, чем отступили, и теперь остальные чтения не находятся в правильном месте.
Это можно исправить, покончив с fprintf
и fscanf
с помощьюзапись всего поля name
с fwrite
:
fwrite(maze.name,sizeof(maze.name), 1, file);
и чтение с fread
:
fread(maze.name,sizeof(maze.name), 1, file);
У вас также есть проблема здесь:
fwrite(&maze.map[x], sizeof(Cell), maze.height, file);
А здесь:
fread(&maze.map[x], sizeof(Cell), maze.height, file);
&maze.map[x]
- это не адрес выделенной памяти, а адрес указателя , на который он указывает . Таким образом, вместо чтения / записи памяти, выделенной для каждого ряда ячеек, вы читаете / записываете память, используемую для ряда указателей для каждой ячейки. Когда вы это сделаете, вы закончите чтение / запись за концом выделенной памяти.
Избавьтесь от оператора address-of, чтобы передать указатель на фактическую память, которую вы читаете / записываете:
fwrite(maze.map[x], sizeof(Cell), maze.height, file);
...
fread(maze.map[x], sizeof(Cell), maze.height, file);