2

バイナリ ファイルに格納されている 4 バイトの数値を読み込もうとしていますが、正しい出力が得られないようです。これが私のコードです:

#include <stdio.h>
#include <stdlib.h>

int main ()
    {
        int res;
        FILE *file;
        float v;

        //Open file
        file = fopen("prj3.dat", "rb");
        if (!file)
        {
            printf("Unable to open file input.dat\n");
        }
        else
        {
            res = fread(&v, sizeof(v), 1, file);
            if(res==-1)
            {
                printf("Unable to open file input.dat\n");
            }
            else
            {
                printf("v = %f\n", v);
            }
        }

        return;
    }

私の出力は v = -961576900.0000000 ですが、v = 3.14159 である必要があります。私の問題がどこにあるかについてのアイデアはありますか?

注意。input.dat はバイナリ ファイルです: 11010000 00001111 01001001 01000000

ありがとう

4

2 に答える 2

4

fread が sizeof(float) と同じ値を返すことを確認してください。これは、読み取っているサイズです。また、ファイル カーソルが正しい場所にあることを確認してください。そうでない場合は、fseek を使用してください。最後に、あなたのファイルはビッグエンディアンのマシンで書かれましたか? 正しく保存されましたか?コードは私には問題ないようです。

于 2009-12-02T16:12:24.083 に答える
0

さらに、あなたもそうあるべきですfclose(file)。フロートに関しては、フロートは実装定義です。

以下の例のようなフォーマット指定子を使用して、このようにすることを検討しませんか?

printf("%8.2f\n",v);  

vこれにより、 の値がピリオドの後に 8 桁と小数点以下 2 桁になるようにフォーマットされ、浮動小数点数が期待される出力に丸められます。バイナリ ファイルはビッグ エンディアン プラットフォームで作成されたように思えます。これを行う方法についてはこちらを参照し、エンディアン ビジネスについてはこちらを参照してください。

バイナリ ファイルが作成された元のシステムでエンディアンをテストする小さなプログラムを作成し、マシンで実行して結果を確認します。

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2009-12-02T16:34:44.283 に答える