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

如何将uint8_t数组原始数据写入文件?替代fputs与循环fputc方案

处理含空字节的uint8_t数组写入:无需循环的方案

当然有!处理这种包含空终止符(0x00)的原始字节数组,根本不用费劲循环调用fputc()——标准C库就提供了完美的解决方案:fwrite()函数,它专门接收数据指针、元素大小和长度参数,一次性写入指定长度的内容,完全不受空字节影响。

核心用法说明

fwrite()的函数签名是:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

参数解释:

  • ptr:指向要写入的数据的指针(这里就是你的uint8_t数组)
  • size:单个数据元素的字节大小(对于uint8_t,直接传sizeof(uint8_t)或者1都可以)
  • nmemb:要写入的元素个数(也就是你的数组长度)
  • stream:目标文件指针

完整示例代码

下面是一个实际的使用例子,包含文件打开、写入、错误检查的完整流程:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

int main() {
    // 示例原始数据,包含多个0x00字节
    uint8_t raw_data[] = {0x00, 0x1F, 0x3E, 0x00, 0xFF, 0x7B};
    size_t data_length = sizeof(raw_data) / sizeof(raw_data[0]);

    // 务必用二进制模式打开文件("wb"),避免系统自动转换换行符破坏原始数据
    FILE *output_file = fopen("raw_output.bin", "wb");
    if (output_file == NULL) {
        perror("Failed to open output file");
        return EXIT_FAILURE;
    }

    // 一次性写入整个数组
    size_t written_count = fwrite(raw_data, sizeof(uint8_t), data_length, output_file);
    if (written_count != data_length) {
        perror("Warning: Not all data was written successfully");
    }

    fclose(output_file);
    return EXIT_SUCCESS;
}

关键注意事项

  • 二进制模式打开:一定要用"wb"(写入二进制)而不是"w"(写入文本)。在Windows系统中,文本模式会自动将0x0A(换行符)转换为0x0D0A,这会彻底破坏你的原始字节数据;虽然Linux/macOS下差异不大,但养成二进制模式写原始数据的习惯更稳妥。
  • 检查返回值:fwrite()返回实际成功写入的元素个数,一定要和你传入的数组长度对比,确保没有写入失败的情况(比如磁盘满了、文件被意外关闭等)。
  • 为什么fputs不行?:fputs()是专门处理C字符串的函数,它会从指针位置开始写入,直到遇到第一个0x00就停止,完全不适合包含空字节的原始数据场景。

备选方案(POSIX系统)

如果你是在Linux、macOS等POSIX兼容系统下开发,还可以使用系统调用write(),它的用法类似:

#include <unistd.h>
#include <fcntl.h>

// ... 打开文件(用open()函数,指定O_WRONLY | O_CREAT | O_TRUNC等标志)
int fd = open("raw_output.bin", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1) { /* 错误处理 */ }

ssize_t bytes_written = write(fd, raw_data, data_length);
if (bytes_written != (ssize_t)data_length) { /* 错误处理 */ }

close(fd);

不过fwrite()是标准C库函数,跨平台性更好,除非你有特殊需求,否则优先用fwrite()。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:26:48