C++ fread的替代用法

C++ fread的替代用法,c++,loops,fread,C++,Loops,Fread,我想用一种奇怪的方式使用fread或类似的东西。我不确定这是否可能。。。让我解释一下: 我有一个二进制文件,名为“dummy”。此文件中包含无符号字符数组。但是,我想将它们放入一个浮点数组中,该数组将存储4倍的内存空间 我可以实现以下目标: FILE* in_file; int numberOfCharacters = 1000; // number of unsigned characters to read ... in_file = fopen("dummy", "rb"); float

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

我有一个二进制文件,名为“dummy”。此文件中包含无符号字符数组。但是,我想将它们放入一个浮点数组中,该数组将存储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;
}
文件*in_文件;
int numberOfCharacters=1000;//要读取的无符号字符数。。。
in_file=fopen(“dummy”、“rb”);
float*floatArray=(float*)malloc(numberOfCharacters*sizeof(float));

对于(int i=0;i这个示例看起来还可以(尽管一些错误检查可能会很好)。一个可能的性能改进可能是将
fread
移动到循环之前,并一次性读取所有1000个条目(到分配的字符数组中)。但这可能只会稍微快一点,因为fread是缓冲的。

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

您还可以使用获取文件的大小

fseek (in_file, 0, SEEK_END);
size=ftell (in_file);
如果要为浮点数组分配更少的内存,请立即执行以下操作:


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

  • 在C语言中,不需要强制转换
    malloc的返回值
  • #包括适当的标题
  • 测试
    fopen
    是否成功,完成后关闭文件
  • 完成后取消分配您的
    floatarray

有什么奇怪的?顺便说一句:对我来说,这似乎是一个C问题。如果二进制文件的源和目标(正在读取的位置)之间的结尾不匹配,您可能会遇到问题写入/读取过程没有考虑到这一点。我拥有的无符号字符数组的长度有点大。因此,任何改进都将非常有用。此外,可能的重复。@直接没有尾数问题,因为他正在读取
无符号字符
s,然后将其强制转换为
浮点
s。