ファイルには様々な種類のものがありますが、最も基本的な区別として、
テキストかバイナリかという違いがあります。
全てのファイルは本質的にはバイナリファイルです。
バイナリを直訳すると、2進数という意味なのですが、
バイナリファイルとはその名の通り、2進数で記録されたファイル、
要するに、数値のみで記録されたファイルのことを意味します。
それに対して、テキストファイルは、文字列だけが記録されたファイルです。
コンピュータの中では、文字列といえども数値で表されているので、
テキストファイルも、本質的にはバイナリファイルです。
しかし、テキストファイルは文字列で記録されているため、
テキストエディタなどで修正を行うことが容易です。
バイナリファイルも、特定のエディタで閲覧・修正することが出来ますが、
全てのデータが数値の固まりになっているため、
中身を見ても、その意味が全くわかりません。
しかし、数値を直接書き込むため、サイズが少なく高速です。
一般に、取り扱いを容易にする必要がある場合はテキストファイル、
高速性が必要とされる場合にはバイナリファイルを利用することが多いようです
テキストであれ、バイナリであれ、ファイル操作の基本的な手順に変わりはありません。
バイナリファイルも、fopen関数、fclose関数を使って開閉します。
ファイル名、モードの指定方法も全く同じです。
ただし、バイナリファイルを開く時には、モード文字列の最後にbをつけます。
ここまで説明したことがわかれば、バイナリファイルの開閉が出来ます。
次のプログラムは、test.datと言う名前のファイルを書き込みのために開く例です。
このプログラムを実行すると、test.datという名前のファイルが作成されます。#include <stdio.h> int main(void) { FILE *file; file = fopen("test.dat","wb"); fclose(file); return 0; }
[ 混同しても使える ]
実際には、バイナリで開いてもテキストデータを読み書き出来ますし、
逆も可能ですが、改行の扱いなどで不便な点が多くなります。
ファイルに数値を直接書き込むには、fwrite関数を使用します。
fwrite関数の使い方は、次の通りです。
書き込む数値を変数に代入しておき、その変数のアドレスを指定します。fwrite(書き込む変数アドレス,1項目のサイズ,項目数,ファイルポインタ);
このプログラムを実行すると、test.datファイルに値が書き込まれますが、#include <stdio.h> int main(void) { int buf = 100; FILE *file; file = fopen("test.dat","wb"); fwrite(&buf,sizeof(buf),1,file); fclose(file); return 0; }
バイナリエディタを使用してファイルを開くと、次のようになります。
LSIC86 は16ビットコンパイラなので、数値は4バイトで書き込まれます。
その他のコンパイラは32ビットなので、8バイトで書き込まれます。
[ test.dat ]ほとんどのバイナリエディタでは、数値を16進数で表示します。
LSIC86 64 00
その他 64 00 00 00
fwrite関数による書き込みでは、配列を1度で書き込むことも出来ます。
[ リトルエンディアンとビッグエンディアン ]
数学では、100を16進数に変換すると、0064になります。
しかし、バイナリエディタで閲覧した結果では、6400になっています。
これは、インテル互換CPUの特徴で、リトルエンディアンと呼ばれる表現です。
この表現では、16進数を2桁ずつに区切り逆の順番で保存します。
一方、マッキントッシュでは IBM製のCPUを使用しており、
こちらは16進数の順番通りに表現される方式で、ビッグエンディアンと呼ばれます。
[ 覚えていますか ]
配列名は、式の中では先頭アドレスになるので、&をつけません。
このプログラムを実行すると、test.datに値が書き込まれます。#include <stdio.h> int main(void) { int buf[] = { 10,100,1000,10000 }; FILE *file; file = fopen("test.dat","wb"); fwrite(buf,sizeof(buf),1,file); fclose(file); return 0; }
[ test.dat ]
LSIC86 0A 00 64 00 E8 03 10 27
その他 0A 00 00 00 64 00 00 00 E8 03 00 00 10 27 00 00
ファイルの数値を直接読み込むには、fread関数を使用します。
fread関数の使い方は、次の通りです。
これを見ると、使い方はfwrite関数と同じであることがわかります。fread(読み込む変数のポインタ,1項目のサイズ,項目数,ファイルポインタ);
このプログラムの実行結果は、test.datファイルの内容によって変わりますが、#include <stdio.h> int main(void) { int buf; FILE *file; file = fopen("test.dat","rb"); fread(&buf,sizeof(buf),1,file); fclose(file); printf("%d\n", buf); return 0; }
[ test.dat ]
0A 00 00 00
fwrite関数と同様にして、配列を読み込むことも出来ます。
10