将原始数据写入文件

时间:2018-02-03 17:10:37

标签: c file null-terminated raw-data

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

问题在于,因为我正在处理原始数据,某处可能有0x00(也就是空终止符),这意味着fputs不可靠,显而易见的替代方法是有一个循环到使用fputc()但有没有办法可以在没有它的情况下做到这一点?

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

2 个答案:

答案 0 :(得分:1)

除了null-character的问题之外,在文本模式下打开文件时读取二进制数据存在问题(例如fgets遇到新行或0x0A和{{1}时停止Windows中的字符)

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

fwrite

并使用FILE *fout = fopen("test.bin", "wb"); fwrite

Reference

答案 1 :(得分:1)

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的返回值可用于检测文件结束(EOF)和I / O错误。如果iRead < NUMBER_OF_ARRAY_ITEMS,则发生错误,或者只有iRead - sizeof(TheData[0])个数字 - 在filepointer的位置和EOF之间的字节段。 (feof(...)ferror(...)可用于确定项目读取次数较少的原因。)