如何将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
相关产品推荐
相关产品推荐

