A fixed-size record can be written and read as one binary item.

record layout A struct groups fields that are stored together as one item.
read back The loaded record fields can be used just like the original fields.

Fixed Record

bonus
fixed_record.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

struct Score {
    int id;
    int points;
};

int main(void) {
    int bonus = 5;
    struct Score original = {42, 80 + bonus};
    struct Score loaded = {0, 0};

    FILE *out = fopen("egtry_c17_record.bin", "wb");
    fwrite(&original, sizeof(original), 1, out);
    fclose(out);

    FILE *in = fopen("egtry_c17_record.bin", "rb");
    fread(&loaded, sizeof(loaded), 1, in);
    fclose(in);
    remove("egtry_c17_record.bin");

    printf("id=%d points=%d\n", loaded.id, loaded.points);
    return 0;
}
#include <stdio.h>

struct Score {
    int id;
    int points;
};

int main(void) {
    int bonus = 0;
    struct Score original = {42, 80 + bonus};
    struct Score loaded = {0, 0};

    FILE *out = fopen("egtry_c17_record.bin", "wb");
    fwrite(&original, sizeof(original), 1, out);
    fclose(out);

    FILE *in = fopen("egtry_c17_record.bin", "rb");
    fread(&loaded, sizeof(loaded), 1, in);
    fclose(in);
    remove("egtry_c17_record.bin");

    printf("id=%d points=%d\n", loaded.id, loaded.points);
    return 0;
}
#include <stdio.h>

struct Score {
    int id;
    int points;
};

int main(void) {
    int bonus = 10;
    struct Score original = {42, 80 + bonus};
    struct Score loaded = {0, 0};

    FILE *out = fopen("egtry_c17_record.bin", "wb");
    fwrite(&original, sizeof(original), 1, out);
    fclose(out);

    FILE *in = fopen("egtry_c17_record.bin", "rb");
    fread(&loaded, sizeof(loaded), 1, in);
    fclose(in);
    remove("egtry_c17_record.bin");

    printf("id=%d points=%d\n", loaded.id, loaded.points);
    return 0;
}
  1. bonus ← 5, original ← (empty), loaded ← (empty), out ← ⟨addr A⟩

    8int main(void) {9    int bonus→ 5 = 5; //@bonus=0, 1010    struct Score original→ (empty) = {42, 80 + bonus5};11    struct Score loaded→ (empty) = {0, 0};1213    FILE *out→ ⟨addr A⟩ = fopen("egtry_c17_record.bin", "wb");14    fwrite(&original(empty), sizeof(original), 1, out⟨addr A⟩);15    fclose(out⟨addr A⟩);1617    FILE *in→ ⟨addr A⟩ = fopen("egtry_c17_record.bin", "rb");18    fread(&loaded(empty), sizeof(loaded), 1, in⟨addr A⟩);19    fclose(in⟨addr A⟩);20    remove("egtry_c17_record.bin");2122    printf("id=%d points=%d\n", loaded(empty).id, loaded.points);23    return 0;24}
    outputid=42 points=85
  1. bonus ← 0, original ← (empty), loaded ← (empty), out ← ⟨addr A⟩

    8int main(void) {9    int bonus→ 0 = 0;10    struct Score original→ (empty) = {42, 80 + bonus0};11    struct Score loaded→ (empty) = {0, 0};1213    FILE *out→ ⟨addr A⟩ = fopen("egtry_c17_record.bin", "wb");14    fwrite(&original(empty), sizeof(original), 1, out⟨addr A⟩);15    fclose(out⟨addr A⟩);1617    FILE *in→ ⟨addr A⟩ = fopen("egtry_c17_record.bin", "rb");18    fread(&loaded(empty), sizeof(loaded), 1, in⟨addr A⟩);19    fclose(in⟨addr A⟩);20    remove("egtry_c17_record.bin");2122    printf("id=%d points=%d\n", loaded(empty).id, loaded.points);23    return 0;24}
    outputid=42 points=80
  1. bonus ← 10, original ← (empty), loaded ← (empty), out ← ⟨addr A⟩

    8int main(void) {9    int bonus→ 10 = 10;10    struct Score original→ (empty) = {42, 80 + bonus10};11    struct Score loaded→ (empty) = {0, 0};1213    FILE *out→ ⟨addr A⟩ = fopen("egtry_c17_record.bin", "wb");14    fwrite(&original(empty), sizeof(original), 1, out⟨addr A⟩);15    fclose(out⟨addr A⟩);1617    FILE *in→ ⟨addr A⟩ = fopen("egtry_c17_record.bin", "rb");18    fread(&loaded(empty), sizeof(loaded), 1, in⟨addr A⟩);19    fclose(in⟨addr A⟩);20    remove("egtry_c17_record.bin");2122    printf("id=%d points=%d\n", loaded(empty).id, loaded.points);23    return 0;24}
    outputid=42 points=90