首页 > 解决方案 > 如何使用 feof 从二进制文件中读取未定义数量的浮点值?

问题描述

我将一些浮点值写入二进制文件,然后我想用另一个.c程序读回它们。

这就是我写它们的方式:

#include <stdio.h>

int main() {
    /* Create the file */
    float x = 1.1;
    FILE *fh = fopen ("file.bin", "wb");
    if (fh != NULL) {
       for (int i = 0; i < 10; ++i)
       {
            x = 1.1*i;
            fwrite (&x,1, sizeof (x), fh);
            printf("%f\n", x);
       }
        fclose (fh);
    }

    return 0;
}

这就是我想阅读它们的方式:

#include <stdio.h>


int main(){
    /* Read the file back in */
    
    FILE *fh = fopen ("file.bin", "wb");
    
    float x = 7.7;
    fh = fopen ("file.bin", "rb");
    if (fh != NULL) {
       
        while(!feof(fh)){
            if(feof(fh))
                break;
            
            fread (&x, 1, sizeof (x), fh);
            printf ("Value is: %f\n", x);
        }
        


        fclose (fh);
    }

    return 0;
}

但我得到了 7.7,这意味着读者从未找到任何值。

我怎样才能做到这一点?我在这里错过了什么?

标签: cfilefloating-pointbinaryfileseof

解决方案


在您的第二个程序中,FILE *fh = fopen ("file.bin", "wb");打开要写入的文件并将其截断为零长度,从而破坏其中的数据。将其更改为FILE *fh = fopen ("file.bin", "rb");并删除后者fh = fopen ("file.bin", "rb");

此外,不要feof用于测试文件中是否有更多数据。仅在先前的读取或写入操作中feof发生 EOF 或错误时报告。如果没有尝试读取过去,它不会告诉您文件位置指示器当前指向文件末尾。相反,请检查 的返回值以查看它读取了多少项。fread

如果使用size_t result = fread(&x, 1, sizeof (x), fh);,则要求fread读取sizeof (x)字节,它将返回读取的字节数。如果小于sizeof (x),则x未读取完整内容。相反,如果您使用size_t result = fread(&x, sizeof x, 1, fh);,则要求fread读取 1 个大小为 的对象sizeof x。然后fread将返回读取的完整对象的数量,这将是 0 或 1。


推荐阅读