web-dev-qa-db-ja.com

freadおよびfwrite関数を使用してバイナリファイルを読み書きする方法

こんにちは私のプロジェクトでは、short(16 bit values)の形式のセンサーデータを含む.binファイルを読み取る必要があります。 fread関数を使用してこれをバッファーに入れていますが、読み込みが正しく行われていないように感じます。 私が書いたものと読んだものとの間に一貫性はありません。ここで何が間違っているのか提案できますか?これは私のプロジェクトのコードではありません...ここでは、freadおよびfwrite関数のみを検証しようとしています。

#include<stdio.h>
void main()
{
    FILE *fp = NULL;

    short x[10] = {1,2,3,4,5,6,5000,6,-10,11};
    short result[10];

    fp=fopen("c:\\temp.bin", "wb");

    if(fp != NULL)
    {
        fwrite(x, 2 /*sizeof(short)*/, 10 /*20/2*/, fp);
        rewind(fp);
        fread(result, 2 /*sizeof(short)*/, 10 /*20/2*/, fp);
    }
    else
        exit(0);

    printf("\nResult");
    printf("\n%d",result[0]);
    printf("\n%d",result[1]);
    printf("\n%d",result[2]);
    printf("\n%d",result[3]);
    printf("\n%d",result[4]);
    printf("\n%d",result[5]);
    printf("\n%d",result[6]);
    printf("\n%d",result[7]);
    printf("\n%d",result[8]);
    printf("\n%d",result[9]);

    fclose(fp)
 }

Fread()(HEX値)を実行した後:

temp.bin:
01 02 03 04 05 06 e1 8e 88 06 ef bf b6 0b...

Fwrite()を実行した後

stdout:
Result
0
914
-28
-28714
-32557
1
512
-32557
908
914
16
user1190135

モードw+(読み取りおよび書き込み)でファイルを開きます。次のコードが機能します。

#include<stdio.h>
int main()
{
    FILE *fp = NULL;

    short x[10] = {1,2,3,4,5,6,5000,6,-10,11};
    short result[10];
    int i;

    fp=fopen("temp.bin", "w+");

    if(fp != NULL)
    {
        fwrite(x, sizeof(short), 10 /*20/2*/, fp);
        rewind(fp);
        fread(result, sizeof(short), 10 /*20/2*/, fp);
    }
    else
        return 1;

    printf("Result\n");
    for (i = 0; i < 10; i++)
        printf("%d = %d\n", i, (int)result[i]);

    fclose(fp);
    return 0;
}

出力あり:

Result
0 = 1
1 = 2
2 = 3
3 = 4
4 = 5
5 = 6
6 = 5000
7 = 6
8 = -10
9 = 11
13
trojanfoe

ファイルを開いたときに、読み取りを許可するのを忘れていました。

fp=fopen("c:\\temp.bin", "wb");

する必要があります:

fp=fopen("c:\\temp.bin", "w+b");
3