
How to read/write a struct into a binary file?
I've tried to follow this answer on SO: https://stackoverflow.com/a/16997175/1984657
However I'm not able to load my character successfully. I do get something back, but when I try to print the name I get a string of unrecognizable characters.
My struct is:
struct Character
{
char name[8];
enum CharClass charClass;
short level;
};
My logic to load or create the character:
#include <stdio.h>
#include <string.h>
#include "character.h"
#include "save_file_manager.h"
struct Character *startup()
{
struct Character *loadedCharacter = loadPlayerCharacter();
if (loadedCharacter != NULL)
{
printf("Welcome back, %s the %s\n", loadedCharacter->name, getClassString(loadedCharacter->charClass));
return loadedCharacter;
}
struct Character createdCharacter;
struct Character *createdCharacterPtr = &createdCharacter;
char name[NAME_LENGTH];
int charClass;
// logic to get name and charClass from user input
strcpy(createdCharacterPtr->name, name);
createdCharacterPtr->charClass = charClass;
createdCharacterPtr->level = 1;
return createdCharacterPtr;
}
And my save, load and prompt to save functions are:
#include "save_file_manager.h"
#include <stdio.h>
#include <stdlib.h>
#include "character.h"
const char *SAVE_FILE_NAME = "./textrpg.sav";
int savePlayerCharacter(struct Character *character)
{
FILE *fptr;
fptr = fopen(SAVE_FILE_NAME, "wb");
fwrite(character, sizeof(struct Character), 1, fptr);
fclose(fptr);
return 0;
}
struct Character *loadPlayerCharacter()
{
FILE *fptr;
fptr = fopen(SAVE_FILE_NAME, "rb");
if (fptr == NULL)
{
return NULL;
}
struct Character *character = malloc(sizeof(struct Character));
int amountRead = fread(character, sizeof(struct Character), 1, fptr);
if (amountRead != 1)
{
return NULL;
}
fclose(fptr);
return character;
}
int promptSave(struct Character *playerCharacter)
{
printf("Would you like to save your character? (y/n)\n");
char save;
scanf(" %c", &save);
if (save == 'y')
{
savePlayerCharacter(playerCharacter);
}
return 0;
}
I probably missed something obvious, but I don't see it. What am I doing wrong?
Solution: I'm allocating heap memory to the created character in startup now:
struct Character *createdCharacterPtr = malloc(sizeof(struct Character));
Thank you everyone for your help.