fread的替代用法

时间:2012-05-04 12:48:44

标签: c++ loops fread

我想以奇怪的方式使用 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;
}

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

提前致谢,

Sait的。

3 个答案:

答案 0 :(得分:2)

示例似乎没问题(虽然一些错误检查可能会很好)。一种可能的性能改进可能是在循环之前移动fread并一次读取所有1000个条目(到已分配的char数组中)。但是,由于fread被缓冲,这可能只会稍快一些。

答案 1 :(得分:1)

脱下袖口:

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

次要尼特:

  • 在C中,您不需要转换malloc
  • 的返回值
  • #include正确的标题
  • 测试fopen是否成功,然后在完成后关闭文件
  • 取消分配floatarray一旦完成

答案 2 :(得分:0)

检查来自fread的返回值是否可以避免额外的循环,并可能用垃圾填充其余的floatArray

您还可以使用

获取文件的大小
fseek (in_file, 0, SEEK_END);
size=ftell (in_file);

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