バイナリファイルの扱い

バイナリファイルの扱いについて勉強しました。


テキストファイルで保存する場合、 データをすべてテキストに変換する必要が出るため処理に時間がかかったり、サイズが大きくなってしまうというデメリットがあります。

そこで、メモリ中のデータをテキストに置き換えずにそのまま書き出すバイナリ形式のファイルが重宝されるようです。

プログラムを書く上でのポイントは、fopenをb(binary)モードで行うことです。

バイナリファイル中のイメージは、文字列に変換されていない”文字列”がバイナリ形式で並んでいる感じです。


// write_binary.c
#include<stdio.h> //perror
#include<stdlib.h> //exit

int main(void)
{
FILE *fp;
char string[] = "We are the world.";
char string2[] = "penguin";

//ファイルをwb(書き込み、バイナリモード)で開く
if((fp = fopen("out.bin", "wb")) == NULL)
{
perror("out.bin");
exit(EXIT_FAILURE);
}

//fpが参照するファイルにstringの参照する内容を書き込む
fwrite(string,sizeof(char), sizeof(string), fp);
fwrite(string2,sizeof(char), sizeof(string2), fp);

if(fclose(fp) == EOF)
{
perror("out.bin");
exit(EXIT_FAILURE);
}
return 0;
}



// read_binary.c
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
FILE *fp;
char string[18]; 
char string2[8]; 

if((fp = fopen("out.bin", "rb")) ==NULL)
{
perror("out.bin");
exit(EXIT_FAILURE);
}

if(fread(string , sizeof(char), 18, fp)!=18)
{
perror("read_binary");
exit(EXIT_FAILURE);
}
if(fread(string2, sizeof(char), 8, fp)!=8)
{
perror("read_binary");
exit(EXIT_FAILURE);
}

if(fclose(fp)==EOF)
{
perror("read_binary");
exit(EXIT_FAILURE);
}

printf("%s%s\n", string, string2);
return 0;
}


$ gcc -o write_binary.c
$ gcc -o read_binary.c


#write_binaryによって生成されたファイルはlessで開くと文字化けしてしまう。
$ less out.bin
We are the world.^@penguin^@

#rea_binaryならちゃんと読み込むことができる。
$ ./read_binary
We are the world.penguin