これまでは「テキストファイル」というサブタイトルでファイルの基礎を行ってきましたが、「テキストファイル」の意味には触れていませんでした。
ファイルには「テキストファイル」と「バイナリファイル」があります。
「テキストファイル」とは文字コードで表されるデータが記録されたファイルであり、メモ帳などで開くと中身を読むことが出来ます。
これまで作ってきた「〜.txt」という拡張子(ドットの後ろの文字)のファイルがテキストファイルですが、「txt」という拡張子とテキストファイルには関係がありません。
「txt」という拡張子を付けておけば(Windowsであれば)ダブルクリックでメモ帳が開くので、「便利だから」使ってきました。
では、他の拡張子のテキストファイルも見てみましょう。
※Visual Studioのプロジェクトフォルダがあれば開いてください。
↓の画像は前に作ったノベルゲームのフォルダです。
「〜.cpp」はC言語のソースプログラムが保管されているテキストファイルです。
皆さんが打ち込んだプログラムがここに入っています。
「メモ帳」を開いておき、「〜.cpp」をドラッグドロップしてみてください。
※「〜.cpp」をダブルクリックするとVisual Studioが開きますので注意してください。
前に打ち込んだプログラムが表示されました。
次に、「〜.vcxproj」というプロジェクトファイルを開いてみましょう。
何が書いてあるかは別にして「読めます」ね。
では、「バイナリファイル」を開いてみます。
プロジェクトフォルダの中にある「Debugフォルダ」を開きます。
「〜.exe」というファイルは「実行ファイル」です。
プログラムを実行するためのファイルであり、人が読むものではありません。
では、メモ帳にドラッグドロップしてみます。
読めません!
下の方に英語が書いてありますが、前半は何も分かりません。
「バイナリファイル」とは、データを文字としてでは無く、ビット列として格納します。
「メモ帳」とは、保存されているデータを文字に変換して表示するアプリケーションです。
文字でないデータを無理やり文字にして表示しているため「読めない」のです。
では、プログラムを作ってみましょう。
まずは「バイナリデータの書き込み」から作ります。
テキストファイルとはファイルをオープンするところから違いますので、オープンとクローズだけ書いてみます。
<sample program 122-01>
#include <stdio.h> int main(void) { FILE* fp; fp = fopen("Test.txt", "wb"); if (fp == NULL) { printf("OPEN ERROR\n"); return 1; } fclose(fp); return 0; } |
ファイルをオープンする際に、「バイナリ」モードで開くよう、モードを「"wb"」と書きました。
この「"b"」がバイナリファイルを表しています。
ファイル名は相変わらず「Test.txt」ですが、前にも書いたようにダブルクリックでメモ帳が開くので拡張子を「txt」にしているだけです。
バイナリファイルに書き込む場合、fprintf関数は使わず、fwrite関数を使います。
<fwrite関数の引数>
fwrite関数には4つの引数を渡します。 fwrite(@, A, B, C); @書き込むデータの先頭番地 Aデータ1つのサイズ(バイト数) Bデータの個数 Cファイルポインタ |
「番地(アドレス)」や「サイズ(バイト数)」という言葉が出てきましたので、下のコラムを読んでください。
コラム「変数などのサイズについて」
コラム「メモリアドレスについて」
では、実際にfwrite関数を使ってみましょう。
<sample program 122-02>
#include <stdio.h> int main(void) { int data = 123; FILE* fp; fp = fopen("Test.txt", "wb"); if (fp == NULL) { printf("OPEN ERROR\n"); return 1; } fwrite(&data, sizeof(int), 1, fp); fclose(fp); return 0; } |
書き込むデータはint型の変数dataに入っていますから、
@書き込むデータの先頭番地は「&data」です。 Aデータ1つのサイズは「sizeof(int)」または「sizeof(data)」です。 Bデータの個数は「1」つです。 Cファイルポインタは「fp」です。
実行し「Test.txt」を開いて確認しましょう。
なぜか「 { 」が入っています。
なぜでしょう?考えてみてください。
ヒントです。
「文字コード表」で「 { 」の文字コードを確認してみましょう。
解答です。
「{」の文字コードは、は10進数で123、16進数で7Bです。
変数dataには10進数の123が入っていました。
バイナリとは「2進数」という意味です。
10進数の123を2進数にすると、
00000000 00000000 00000000 01111011
です。
これをバイト単位で保存しています。
メモ帳は保存されたデータを文字に変換して表示するアプリケーションだと書きました。
上の2進数を文字にすると「 { 」なのです。
こうやって2進数や文字コードを知らない人には、全く「読めない」ファイルになるのです。
次回は「バイナリデータの読み込み」をやります。