Systems IO
Binary Read Count
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
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;
}
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");sum ← 2
pass 1 of 318for (int i0 = 0; i < read3; i++) {19 sum→ 2 = sum + loaded[i]2;20}All 3 passes — pass 1 is the card above pass iloaded[i]sum1 0 2 0 → 2 2 1 4 2 → 6 3 2 6 6 → 12 printf("read=%d sum=%d ", read, sum);
22 printf("read=%d sum=%d\n", read3, sum12);23 return 0;24}outputread=3 sum=12
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");sum ← 2
pass 1 of 218for (int i0 = 0; i < read2; i++) {19 sum→ 2 = sum + loaded[i]2;20}sum ← 6
pass 2 of 218for (int i1 = 0; i < read2; i++) {19 sum→ 6 = sum + loaded[i]4;20}printf("read=%d sum=%d ", read, sum);
22 printf("read=%d sum=%d\n", read2, sum6);23 return 0;24}outputread=2 sum=6
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");sum ← 2
pass 1 of 418for (int i0 = 0; i < read4; i++) {19 sum→ 2 = sum + loaded[i]2;20}All 4 passes — pass 1 is the card above pass iloaded[i]sum1 0 2 0 → 2 2 1 4 2 → 6 3 2 6 6 → 12 4 3 8 12 → 20 printf("read=%d sum=%d ", read, sum);
22 printf("read=%d sum=%d\n", read4, sum20);23 return 0;24}outputread=4 sum=20