1

この小さなコードサンプルでここに示されているように、inttypes にいくつかの問題があります。

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>


void print_byte(uint8_t b)
{
    printf("%d%d%d%d%d%d%d%d\n",
        !!(b & 128), !!(b & 64), !!(b & 32), !!(b & 16),
        !!(b & 8), !!(b & 4), !!(b & 2), !!(b & 1));
}

int main()
{
    FILE *f;
    uint8_t bs = 8;
    uint16_t bw = 100, bh = 200;
    f = fopen("out", "w+");

    print_byte(bs);
    printf("%"PRIu8" %"PRIu16" %"PRIu16"\n", bs, bw, bh);
    fprintf(f, "%"PRIu8"%"PRIu16"%"PRIu16, bs, bw, bh);
    fclose(f);

    f = fopen("out", "r");

    fscanf(f, "%"SCNu8"%"SCNu16"%"SCNu16, &bs, &bw, &bh);   
    printf("%"PRIu8" %"PRIu16" %"PRIu16"\n", bs, bw, bh);
    print_byte(bs);
    fclose(f);

    return 0;
}

私に与えます

gcc -o test test.c && ./test
00001000
8 100 200
104 100 200
01101000

fscanf でSCNu8toを変更すると、取得するはずのものが得られます。SCNo8

00001000
8 100 200
8 100 200
00001000

問題はどこだ?最初のコードでは機能しない理由がわかりませんが、そのバイトを 8 進数値として解釈すると機能します。

4

1 に答える 1

5

問題は、テキストファイル内の値が次のようにマージされてしまうことです。

8100200

そのため、データを正しく読み戻すことができません。fscanf最初の数字がどこで終わり、次の数字が始まるかがわかりません。

フォーマット行にスペースを入れると、fprintfこの問題が修正されます。

fprintf(f, "%"PRIu8" %"PRIu16" %"PRIu16, bs, bw, bh);

[fscanfは] 1バイトの値を読み取り、次に2つの2バイトを読み取ることになっています

fscanfバイトではなくテキストを読み取ります。バイトを書き込みたい場合は、バイナリの出力と入力にライブラリ関数を使用しfwriteますfread

// Writing in binary
f = fopen("out.bin", "wb");
fwrite(&bs, sizeof(bs), 1, f);
fwrite(&bw, sizeof(bw), 1, f);
fwrite(&bh, sizeof(bh), 1, f);
fclose(f);
// Reading in binary
f = fopen("out.bin", "rb");
fread(&bs, sizeof(bs), 1, f);
fread(&bw, sizeof(bw), 1, f);
fread(&bh, sizeof(bh), 1, f);
于 2016-02-13T16:12:52.617 に答える