web-dev-qa-db-ja.com

Cのバイナリファイルの読み取り/書き込み

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

50
user1257114

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

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

あなたはそれを読むことができると言いましたが、それは正しく出力されません...

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%xに変更して、これを少し明確にします:

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

ねえ、見て!データが一致しました*。驚くべきことに、バイナリファイルを正しく読み取る必要があります。

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

82
Mike