当输入数据保存在一个二维数组中并且每一列都必须保存到一个单独的文件中时,是否有一个最佳实践来说明如何将数据馈送到fwrite()?
下面的示例模拟从文件(“buffer”)读取的数据,该文件被处理并解析为8行x 3列数组(“processedData”)。接下来的一个循环为每一列创建一个新的文件指针,通过一次阅读一列并保存每个文件来填充该指针。这将产生3个文件,每个文件8个字节。
是否有更有效的方法将列数据提供给fwrite(),而不是一次循环遍历数组内容的一列?
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
uint8_t t, p, s;
// Assume inputFile is a buffer with the contents of a file from disk
uint8_t buffer[24] = {2, 1, 3, 3, 2, 4, 4, 3, 5, 5, 4, 6, 6, 5, 7, 7, 6, 8, 8, 7, 9, 9, 8, 0};
uint8_t(*processedData)[8][3] = malloc(sizeof *processedData);
memset(processedData, '\0', sizeof(*processedData));
// Assume the contents of the buffer are processed in some way...
for (s = 0; s < 24; s++)
(*processedData)[s % 8][s % 3] = buffer[s];
// Parse the processed content by column and save in 3 separate files
for (t = 0; t < 3; t++)
{
uint8_t *hld = (uint8_t *)calloc(8, sizeof(uint8_t));
for (p = 0; p < 8; p++)
hld[p] = (*processedData)[p][t];
char *fileName = (char *)malloc(sizeof(char) * 30);
sprintf(fileName, "%s-%u", "TestFile", t);
FILE *tmpFile = fopen(fileName, "w+");
if (tmpFile == NULL)
{
fputs("File error", stderr);
exit(1);
}
fwrite(hld, 1, 8, tmpFile);
fclose(tmpFile);
free(hld);
}
return 0;
}
字符串
1条答案
按热度按时间2hh7jdfx1#
您的方法可以工作,但有点麻烦,并有几个问题:
"wb"
以二进制模式打开文件。"w+"
中的+
,其允许除了写入之外从文件阅读。hld
数组似乎不需要内存分配。“uint8_t
作为循环索引变量是容易出错。s / 3
而不是s % 8
。sprintf
没有缓冲区溢出保护:则应改用snprintf()
。关于您的问题:* 是否有更有效的方法将列数据提供给fwrite(),而不是一次一列地循环数组内容?*
由于分栏式数据不是连续的字节集,因此您必须以某种方式逐一查看2D数组,才能收集要输出的数据。请注意,不需要使用
fwrite
,您可以直接对每个字节使用fputc
,而不需要中间的hld
数组。然而,如果数据元素大于一个字节,或者如果应用程序是多线程的,则在数组中收集数据并使用单个fwrite
可能更容易、更高效。只要确保输出文件以二进制模式打开即可。以下是修改后的版本:
字符串
还要注意,
processedData
可以直接指向buffer
,从而避免了分配和初始化的需要:型