В некоторых структурах struct stat есть дополнительные члены, которые оказываются полезными при копировании файлов:
st_blksize The optimal I/O block size for the file.
st_blocks The actual number of blocks allocated for the file in
(check local system).
Если размер блока, который вы читаете, даже кратен st_blksize, вы стремитесь получить более эффективное чтение файла,
size_t desiredSize = 1E4; // largest buffer size to read into
size_t blocks = desiredSize / st.st_blksize;
if ( blocks < 1 ) // fail safe test
blocks = 1;
size_t true_size = blocks * st.st_blksize; // this is the size to read
char *buffer = malloc(true_size);
Сбой st_blksize,предоставляет макрос BUFSIZ для размера буфера.