★ファイル操作(バイナリファイル1)★


これまでは「テキストファイル」というサブタイトルでファイルの基礎を行ってきましたが、「テキストファイル」の意味には触れていませんでした。

ファイルには「テキストファイル」と「バイナリファイル」があります。

「テキストファイル」とは文字コードで表されるデータが記録されたファイルであり、メモ帳などで開くと中身を読むことが出来ます。

これまで作ってきた「〜.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進数や文字コードを知らない人には、全く「読めない」ファイルになるのです。

次回は「バイナリデータの読み込み」をやります。


次へ

戻る

目次へ