2

我想以一种奇怪的方式使用fread或类似的东西。我不确定这是否可能......让我解释一下这个案例:

我有一个名为“ dummy ”的二进制文件。该文件中包含 unsigned char 数组。但是,我想将它们放入一个浮点数组中,该数组将存储 4 倍的内存空间。

我可以实现如下目标:

FILE* in_file;
int numberOfCharacters = 1000; // number of unsigned characters to read ...
in_file = fopen("dummy", "rb");

float* floatArray = (float*) malloc( numberOfCharacters * sizeof(float) );

for(int i=0;i<numberOfCharacters;i++)
{
    unsigned char temp;
    fread(&temp, sizeof(unsigned char), 1, in_file);
    floatArray[i] = temp;
}

我知道(实际上并没有真正尝试过)这种方式可能会奏效。但我很好奇是否有更好(更快)的方法呢?也许,没有循环..?

提前致谢,

坐下。

4

3 回答 3

2

该示例看起来没问题(尽管一些错误检查可能很好)。一种可能的性能改进可能是将fread之前的循环移动并一次读取所有 1000 个条目(进入分配的 char 数组)。但这可能只会稍微快一点,因为 fread 被缓冲了。

于 2012-05-04T12:52:18.740 回答
1

袖口:

  • 如果二进制文件的源和目标(正在读取它的位置)之间的字节序不匹配,并且写入/读取过程没有考虑到这一点,您可能会遇到问题。
  • 查找setvbuf为您的文件设置缓冲模式。
  • 您可能还想查看内存映射文件 ( mmap)
  • fstream这在 C++ 中使用(文件流)和迭代器(即在语法上)要容易得多。此外,如果您想要性能,您可以通过覆盖适当的成员来创建自己的优化文件流。
  • 如需进一步阅读,请查看过滤流缓冲区

小尼特:

  • 在 C 中,您不需要强制转换的返回值malloc
  • #include正确的标题
  • 测试是否fopen成功,然后在完成后关闭文件
  • 取消分配你的floatarray一次完成
于 2012-05-04T13:00:56.467 回答
0

检查 fread 的返回值是否为 EOF 将避免额外的循环并可能用垃圾填充 floatArray 的其余部分

你也可以得到文件的大小

fseek (in_file, 0, SEEK_END);
size=ftell (in_file);

如果要为浮点数组分配更少的内存

于 2012-05-04T12:55:43.110 回答