Write and read structs to/from files in C

note, Jun 22, 2024, on Mitja Felicijan's blog

First let's define a shared header file for the struct definition.

// struct.h
typedef struct {
    char name[50];
    int health;
    float damage;
} Character;

Now lets write it to a character.dat file.

// write.c
#include <stdio.h>
#include <string.h>

#include "struct.h"

int main(void) {
    printf("Write struct\n");

    Character ch;

    strcpy(ch.name, "John Doe");
    ch.health = 30;
    ch.damage = 5.9;

    FILE* file = fopen("character.dat", "wb");
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    fwrite(&ch, sizeof(Character), 1, file);
    fclose(file);

    return 0;
}

If we check the contents of the character.dat file it should look like this.

$ xxd character.dat
00000000: 4a6f 686e 2044 6f65 0000 0000 0000 0000  John Doe........
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 1e00 0000 cdcc bc40            ...........@

Reading and serializing back to a struct.

// read.c
#include <stdio.h>

#include "struct.h"

int main(void) {
    printf("Read struct\n");

    Character ch;

    FILE* file = fopen("character.dat", "rb");
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    fread(&ch, sizeof(Character), 1, file);
    fclose(file);

    printf("Name: %s\n", ch.name);
    printf("Health: %d\n", ch.health);
    printf("Damage: %.1f\n", ch.damage);

    return 0;
}

Other notes

DateTitle
Set color temperature of displays on i3
Simple presentations with Markdown
Uninstall Ollama from a Linux box
Personal sane Vim defaultsvim
Make DCSS playable on 4k displaysdcss
Grep to Less that maintain colors
Edsger W. Dijkstra Manuscripts ebook
Write ISO to USB Key
Aerial photography of algae spotted on river Sava
Display xterm color palette
Add lazy loading of images in Jekyll posts
Lua performance in different environments
Use option key as meta in Alacritty under macOS
Mount Plan9 over networkplan9
AWS EB PyYAML fix