在嵌入式应用程序中,我需要将二进制文件读入有限的内存中, 然后在最短的时间内解析它。
可以读取整个文件并分配内存:
char **array = malloc(sizeof(char *) * row);
for(char c = 0; c < 240; c++){ /*320 x 240 file*/
array[c] = malloc(320);
}
这将导致至少240个指针,每个4字节
可替换地:
array = malloc(320*240);
最小化指针,但会导致每次访问的乘法 解析。如果没有硬件繁殖,那将是非常昂贵的。
对于解析,内存中一次至少需要三行。
从SD卡读取速度很慢,我不确定是否一次读取一行 解析将比一次读取整个文件慢,然后解析。
这个问题的答案将决定该问题的内存大小要求 处理器。当然,较小的处理器会更便宜,这是一个巨大的 因素,但解析时间可能是一个更大的因素。
答案 0 :(得分:0)
如果不知道可用的文件访问器方法是什么就很难给出完整的建议,但是你可能想要考虑使用类似fread的东西一次读取一个指定大小的块,然后使用那个连续填充(如前所述)一个3缓冲区集。如下所示:
FILE *fileStream = fopen ("file.bin", "rb");
char **array = malloc(sizeof(char *) * 3);
int i = 0;
size_t bytesRead = 0;
while (!feof(fileStream))
{
for (i = 0; i < 3; i++)
{
/* If read has returned some bytes - i.e. not at EOF */
if (fread (&array[i], 1, 320, fileStream))
{
/* Assuming target knows size of array. Pass in number in iteration
* so target function knows where the read ends */
doProcessing (array, i);
}
}
}
这将允许文件流处理您在其内部缓冲区中关注的IO缓冲等,然后您可以使用fread来阅读单点菜单。
然而,在说这个时,我做了几个假设: