在C语言中将文件大小向上取整至16的倍数并补零
解决方案
先计算需要填充的空字节数,再通过批量写入完成填充,同时补充必要的错误处理逻辑。以下是补全后的完整代码:
#include <stdio.h> #include <sys/stat.h> void pad_file_to_16x(const char *filename) { FILE *input_stream = fopen(filename, "rb+"); if (input_stream == NULL) { perror(filename); return; } struct stat s; // 补充stat调用的错误检查 if (stat(filename, &s) == -1) { perror("stat failed"); fclose(input_stream); return; } if (s.st_size % 16 != 0) { // 计算需要填充的字节数:向上取整到16的倍数后减去原文件大小 size_t pad_bytes = 16 - (s.st_size % 16); fseek(input_stream, 0, SEEK_END); // 批量写入空字节,比循环单字节写入效率更高 const unsigned char padding = '\x00'; size_t written = fwrite(&padding, 1, pad_bytes, input_stream); if (written != pad_bytes) { perror("failed to pad file"); } // 强制刷新缓冲区到磁盘,确保写入生效 fflush(input_stream); } fclose(input_stream); }
关键逻辑说明
- 填充字节计算:用
16 - (s.st_size % 16)直接得到需要补充的空字节数,无需复杂的整除运算。 - 高效写入:使用
fwrite一次性写入所有空字节,避免循环调用fputc带来的性能损耗。 - 错误处理:新增
stat调用的错误检查,以及fwrite写入结果校验,避免静默失败。 - 资源管理:确保文件流最终被关闭,防止资源泄漏。
额外注意点
- 若文件在
stat和fseek之间被其他进程修改,可能出现数据不一致,需严格保证原子性的话可添加文件锁(如flock)。 - 使用
rb+二进制模式打开文件,避免不同系统下的换行符转换干扰文件大小计算。
内容的提问来源于stack exchange,提问作者FreeAntiVirus
相关产品推荐
相关产品推荐

