C doesn't seem to have an idiom for looping over something by chunks that might be misaligned.
while ( (c = getc()) != EOF) write(c); VS for (i = 0; i < file_sz; i += chunk_sz) write(i, chunk_sz);
When chunk_sz = 1, the two loops work the same; when chunk_sz = 4096 we might end up with un-handled bits at the end of the file.... So, what are the options?
// correct and verbose q = file_sz / chunk_sz; r = file_sz % chunk_sz; for (i = 0; i < q; i++) write(i*chunk_sz, chunk_sz); if (r) write(q*chunk_sz, r); // give up if (file_sz % chunk_sz) return -1; for (i = 0; i < file_sz; i += chunk_sz) write(i, chunk_sz); // write a consumer int consume(off64_t *b, off64_t *s) { *b -= *s if (*b < 0) return *b + *s; return *s; } while ( (c = consume(&remaining, &chunk_sz)) > 0) write(total - remaining, c); #define MIN(x, y) ( (x) < (y) ? (x) : (y) ) // compact, readable? for (i = 0; (c = MIN(total, i+chunk_sz) - i) > 0; i += c ) write(i, c);
With complex data, a consumer function makes sense. With byte sequences, I prefer the last as we don't reduplicate the call to our imaginary write(), however we need to introduce a macro MIN for type-agnostic comparison (fmin() casts to double = path to hell).