将原始数据写入文件
Writing raw data to a file
我有一个 uint8_t
原始数据数组,我想将其写入文件(我有它的长度)
问题是,因为我正在处理原始数据,所以某处可能有一个 0x00
(又名空终止符),这意味着 fputs
不可靠,明显的替代方法是有一个循环使用 fputc()
但有没有办法不用它呢?
是否有一个函数接受指针和大小并将指针位置的数据量写入文件?
除了空字符问题外,在文本模式下打开文件时读取二进制数据也有问题(例如 fgets
遇到换行时停止或 0x0A
和 0x1A
Windows)
中的字符
改为以二进制模式打开文件,并使用fread
/fwrite
FILE *fout = fopen("test.bin", "wb");
并使用fwrite
和fread
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
的 return 值可用于检测文件结束 (EOF) 和 I/O 错误。如果 iRead < NUMBER_OF_ARRAY_ITEMS
,则要么发生错误,要么在文件指针的位置和 EOF 之间只有 iRead
个 sizeof(TheData[0])
字节的段。 (feof(...)
或 ferror(...)
可用于确定项目读取计数低的原因。)
我有一个 uint8_t
原始数据数组,我想将其写入文件(我有它的长度)
问题是,因为我正在处理原始数据,所以某处可能有一个 0x00
(又名空终止符),这意味着 fputs
不可靠,明显的替代方法是有一个循环使用 fputc()
但有没有办法不用它呢?
是否有一个函数接受指针和大小并将指针位置的数据量写入文件?
除了空字符问题外,在文本模式下打开文件时读取二进制数据也有问题(例如 fgets
遇到换行时停止或 0x0A
和 0x1A
Windows)
改为以二进制模式打开文件,并使用fread
/fwrite
FILE *fout = fopen("test.bin", "wb");
并使用fwrite
和fread
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
的 return 值可用于检测文件结束 (EOF) 和 I/O 错误。如果 iRead < NUMBER_OF_ARRAY_ITEMS
,则要么发生错误,要么在文件指针的位置和 EOF 之间只有 iRead
个 sizeof(TheData[0])
字节的段。 (feof(...)
或 ferror(...)
可用于确定项目读取计数低的原因。)