79

バイナリファイルに書き込むことができるコードの例はありますか? また、バイナリ ファイルを読み取って画面に出力できるコードも含まれます。例を見ると、ファイルに書き込むことができますが、ファイルから読み込もうとすると、正しく出力されません。

4

6 に答える 6

124

バイナリ ファイルの読み取りと書き込みは、他のファイルとほとんど同じです。唯一の違いは、ファイルを開く方法です。

unsigned char buffer[10];
FILE *ptr;

ptr = fopen("test.bin","rb");  // r for read, b for binary

fread(buffer,sizeof(buffer),1,ptr); // read 10 bytes to our buffer

あなたはそれを読むことができると言ったが、正しく出力されていない...このデータを「出力」するとき、ASCIIを読んでいないので、文字列を画面に出力するのとは違うことに注意してください:

for(int i = 0; i<10; i++)
    printf("%u ", buffer[i]); // prints a series of bytes

fwrite()ファイルへの書き込みは、次の代わりに使用していることを除いて、ほとんど同じですfread()

FILE *write_ptr;

write_ptr = fopen("test.bin","wb");  // w for write, b for binary

fwrite(buffer,sizeof(buffer),1,write_ptr); // write 10 bytes from our buffer

Linux について話しているので、健全性チェックを行う簡単な方法があります。システムにインストールhexdumpし (まだインストールされていない場合)、ファイルをダンプします。

mike@mike-VirtualBox:~/C$ hexdump test.bin
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0001 003e 0001 0000 0000 0000 0000 0000
...

それをあなたの出力と比較してください:

mike@mike-VirtualBox:~/C$ ./a.out 
127 69 76 70 2 1 1 0 0 0

うーん、おそらくこれprintfを aに変更して、%xこれを少し明確にします。

mike@mike-VirtualBox:~/C$ ./a.out 
7F 45 4C 46 2 1 1 0 0 0

ねえ、見て!データが一致するようになりました* . すばらしい、バイナリ ファイルを正しく読み取っているはずです!

*バイトは出力でスワップされているだけですが、そのデータは正しいことに注意してください。この種のことを調整できます

于 2013-07-11T16:31:14.290 に答える
2

「弱いピンストレージプログラムを作成する」ソリューションに非常に満足しています。おそらく、従うべき非常に単純なバイナリ ファイル IO の例が必要な人に役立つでしょう。

$ ls
WeakPin  my_pin_code.pin  weak_pin.c
$ ./WeakPin
Pin: 45 47 49 32
$ ./WeakPin 8 2
$ Need 4 ints to write a new pin!
$./WeakPin 8 2 99 49
Pin saved.
$ ./WeakPin
Pin: 8 2 99 49
$
$ cat weak_pin.c
// a program to save and read 4-digit pin codes in binary format

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

#define PIN_FILE "my_pin_code.pin"

typedef struct { unsigned short a, b, c, d; } PinCode;


int main(int argc, const char** argv)
{
    if (argc > 1)  // create pin
    {
        if (argc != 5)
        {
            printf("Need 4 ints to write a new pin!\n");
            return -1;
        }
        unsigned short _a = atoi(argv[1]);
        unsigned short _b = atoi(argv[2]);
        unsigned short _c = atoi(argv[3]);
        unsigned short _d = atoi(argv[4]);
        PinCode pc;
        pc.a = _a; pc.b = _b; pc.c = _c; pc.d = _d;
        FILE *f = fopen(PIN_FILE, "wb");  // create and/or overwrite
        if (!f)
        {
            printf("Error in creating file. Aborting.\n");
            return -2;
        }

        // write one PinCode object pc to the file *f
        fwrite(&pc, sizeof(PinCode), 1, f);  

        fclose(f);
        printf("Pin saved.\n");
        return 0;
    }

    // else read existing pin
    FILE *f = fopen(PIN_FILE, "rb");
    if (!f)
    {
        printf("Error in reading file. Abort.\n");
        return -3;
    }
    PinCode pc;
    fread(&pc, sizeof(PinCode), 1, f);
    fclose(f);

    printf("Pin: ");
    printf("%hu ", pc.a);
    printf("%hu ", pc.b);
    printf("%hu ", pc.c);
    printf("%hu\n", pc.d);
    return 0;
}
$
于 2019-03-29T16:27:45.387 に答える