u/HouseMFD

How to read/write a struct into a binary file?

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.

u/HouseMFD — 1 day ago

Why can I use `scanf` on an explicit int, but not on an enum?

My understanding is that an enum would be compiled to an integer, so I expected to be able to use it for input in the same way as an integer, however it exited the program I'm working on instead.

Not working code:

    enum CharacterClass charClass;


    scanf("%d", &charClass);


    printf("Your class is %s.\n", getClassString(charClass));

Working code:

    int charClass;


    scanf("%d", &charClass);


    printf("Your class is %s.\n", getClassString(charClass));
reddit.com
u/HouseMFD — 5 days ago