将原始数据写入文件

Writing raw data to a file

我有一个 uint8_t 原始数据数组,我想将其写入文件(我有它的长度)

问题是,因为我正在处理原始数据,所以某处可能有一个 0x00(又名空终止符),这意味着 fputs 不可靠,明显的替代方法是有一个循环使用 fputc() 但有没有办法不用它呢?

是否有一个函数接受指针和大小并将指针位置的数据量写入文件?

除了空字符问题外,在文本模式下打开文件时读取二进制数据也有问题(例如 fgets 遇到换行时停止或 0x0A0x1A Windows)

中的字符

改为以二进制模式打开文件,并使用fread/fwrite

FILE *fout = fopen("test.bin", "wb");

并使用fwritefread

Reference

freadfwrite 是你的朋友。

uint8_t TheData[NUMBER_OF_ARRAY_ITEMS] = {0};
// ... Transformations to your data ...

// Persist the data
FILE *fHandleOutput = fopen("test.bin", "wb");
if(!fHandleOutput){
   printf("Error: Output file handle was NULL!\n");
   return;
}
// SIGNATURE: fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
fwrite(TheData, sizeof(TheData[0]), NUMBER_OF_ARRAY_ITEMS, fHandleOutput);
fflush(fHandleOutput); // Ensure changes get written to disk before we close
fclose(fHandleOutput);
fHandleOutput = NULL;


// Read the data
// Incoming data buffer
uint8_t TheData[NUMBER_OF_ARRAY_ITEMS] = {0};
// Attempt file open for binary mode
FILE *fHandleInput = fopen("test.bin", "rb");
if(!fHandleInput){
   printf("Error: Input file handle was NULL!\n");
   return;
}
// SIGNATURE: fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
size_t iRead = fread(TheData, sizeof(TheData[0]), NUMBER_OF_ARRAY_ITEMS, fHandleInput);

fclose(fHandleInput);
fHandleInput = NULL;

值得注意的是,fread 的 return 值可用于检测文件结束 (EOF) 和 I/O 错误。如果 iRead < NUMBER_OF_ARRAY_ITEMS,则要么发生错误,要么在文件指针的位置和 EOF 之间只有 iReadsizeof(TheData[0]) 字节的段。 (feof(...)ferror(...) 可用于确定项目读取计数低的原因。)