The count returned by fread tells the loop how many binary items were loaded.

read count The returned item count is safer than assuming the full buffer was filled.
bounded loop The sum loop uses the returned count as its upper bound.

Binary Read Count

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

int main(void) {
    int count = 3;
    int values[4] = {2, 4, 6, 8};
    int loaded[4] = {0, 0, 0, 0};
    int sum = 0;

    FILE *out = fopen("egtry_c17_count.bin", "wb");
    fwrite(values, sizeof(values[0]), count, out);
    fclose(out);

    FILE *in = fopen("egtry_c17_count.bin", "rb");
    int read = (int)fread(loaded, sizeof(loaded[0]), 4, in);
    fclose(in);
    remove("egtry_c17_count.bin");

    for (int i = 0; i < read; i++) {
        sum = sum + loaded[i];
    }

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

int main(void) {
    int count = 2;
    int values[4] = {2, 4, 6, 8};
    int loaded[4] = {0, 0, 0, 0};
    int sum = 0;

    FILE *out = fopen("egtry_c17_count.bin", "wb");
    fwrite(values, sizeof(values[0]), count, out);
    fclose(out);

    FILE *in = fopen("egtry_c17_count.bin", "rb");
    int read = (int)fread(loaded, sizeof(loaded[0]), 4, in);
    fclose(in);
    remove("egtry_c17_count.bin");

    for (int i = 0; i < read; i++) {
        sum = sum + loaded[i];
    }

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

int main(void) {
    int count = 4;
    int values[4] = {2, 4, 6, 8};
    int loaded[4] = {0, 0, 0, 0};
    int sum = 0;

    FILE *out = fopen("egtry_c17_count.bin", "wb");
    fwrite(values, sizeof(values[0]), count, out);
    fclose(out);

    FILE *in = fopen("egtry_c17_count.bin", "rb");
    int read = (int)fread(loaded, sizeof(loaded[0]), 4, in);
    fclose(in);
    remove("egtry_c17_count.bin");

    for (int i = 0; i < read; i++) {
        sum = sum + loaded[i];
    }

    printf("read=%d sum=%d\n", read, sum);
    return 0;
}
  1. count ← 3, values ← ⟨addr A⟩, loaded ← ⟨addr B⟩, sum ← 0, out ← ⟨addr C⟩

    3int main(void) {4    int count→ 3 = 3; //@count=2, 45    int values→ ⟨addr A⟩[4] = {2, 4, 6, 8};6    int loaded→ ⟨addr B⟩[4] = {0, 0, 0, 0};7    int sum→ 0 = 0;89    FILE *out→ ⟨addr C⟩ = fopen("egtry_c17_count.bin", "wb");10    fwrite(values⟨addr A⟩, sizeof(values[0]), count3, out⟨addr C⟩);11    fclose(out⟨addr C⟩);1213    FILE *in→ ⟨addr C⟩ = fopen("egtry_c17_count.bin", "rb");14    int read→ 3 = (int)fread(loaded⟨addr B⟩, sizeof(loaded[0]), 4, in⟨addr C⟩);15    fclose(in⟨addr C⟩);16    remove("egtry_c17_count.bin");
  2. sum ← 2

    pass 1 of 3
    18for (int i0 = 0; i < read3; i++) {19    sum→ 2 = sum + loaded[i]2;20}
    All 3 passes — pass 1 is the card above
    passiloaded[i]sum
    1020 2
    2142 6
    3266 12
  3. printf("read=%d sum=%d ", read, sum);

    22    printf("read=%d sum=%d\n", read3, sum12);23    return 0;24}
    outputread=3 sum=12
  1. count ← 2, values ← ⟨addr A⟩, loaded ← ⟨addr B⟩, sum ← 0, out ← ⟨addr C⟩

    3int main(void) {4    int count→ 2 = 2;5    int values→ ⟨addr A⟩[4] = {2, 4, 6, 8};6    int loaded→ ⟨addr B⟩[4] = {0, 0, 0, 0};7    int sum→ 0 = 0;89    FILE *out→ ⟨addr C⟩ = fopen("egtry_c17_count.bin", "wb");10    fwrite(values⟨addr A⟩, sizeof(values[0]), count2, out⟨addr C⟩);11    fclose(out⟨addr C⟩);1213    FILE *in→ ⟨addr C⟩ = fopen("egtry_c17_count.bin", "rb");14    int read→ 2 = (int)fread(loaded⟨addr B⟩, sizeof(loaded[0]), 4, in⟨addr C⟩);15    fclose(in⟨addr C⟩);16    remove("egtry_c17_count.bin");
  2. sum ← 2

    pass 1 of 2
    18for (int i0 = 0; i < read2; i++) {19    sum→ 2 = sum + loaded[i]2;20}
  3. sum ← 6

    pass 2 of 2
    18for (int i1 = 0; i < read2; i++) {19    sum→ 6 = sum + loaded[i]4;20}
  4. printf("read=%d sum=%d ", read, sum);

    22    printf("read=%d sum=%d\n", read2, sum6);23    return 0;24}
    outputread=2 sum=6
  1. count ← 4, values ← ⟨addr A⟩, loaded ← ⟨addr B⟩, sum ← 0, out ← ⟨addr C⟩

    3int main(void) {4    int count→ 4 = 4;5    int values→ ⟨addr A⟩[4] = {2, 4, 6, 8};6    int loaded→ ⟨addr B⟩[4] = {0, 0, 0, 0};7    int sum→ 0 = 0;89    FILE *out→ ⟨addr C⟩ = fopen("egtry_c17_count.bin", "wb");10    fwrite(values⟨addr A⟩, sizeof(values[0]), count4, out⟨addr C⟩);11    fclose(out⟨addr C⟩);1213    FILE *in→ ⟨addr C⟩ = fopen("egtry_c17_count.bin", "rb");14    int read→ 4 = (int)fread(loaded⟨addr B⟩, sizeof(loaded[0]), 4, in⟨addr C⟩);15    fclose(in⟨addr C⟩);16    remove("egtry_c17_count.bin");
  2. sum ← 2

    pass 1 of 4
    18for (int i0 = 0; i < read4; i++) {19    sum→ 2 = sum + loaded[i]2;20}
    All 4 passes — pass 1 is the card above
    passiloaded[i]sum
    1020 2
    2142 6
    3266 12
    43812 20
  3. printf("read=%d sum=%d ", read, sum);

    22    printf("read=%d sum=%d\n", read4, sum20);23    return 0;24}
    outputread=4 sum=20