You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:06:15