我有一个uint8_t
原始数据数组,我想写入文件(我有它的长度)
问题在于,因为我正在处理原始数据,某处可能有0x00
(也就是空终止符),这意味着fputs
不可靠,显而易见的替代方法是有一个循环到使用fputc()
但有没有办法可以在没有它的情况下做到这一点?
是否有一个函数采用指针和大小并将指针位置的数据量写入文件?
答案 0 :(得分:1)
除了null-character的问题之外,在文本模式下打开文件时读取二进制数据存在问题(例如fgets
遇到新行或0x0A
和{{1}时停止Windows中的字符)
改为以二进制模式打开文件,并使用0x1A
/ fread
fwrite
并使用FILE *fout = fopen("test.bin", "wb");
和fwrite
答案 1 :(得分:1)
fread
和fwrite
是您的朋友。
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(...)
可用于确定项目读取次数较少的原因。)