C言語

【C言語】第7章第3回:テキストファイルとバイナリファイルの違い

ファイル操作の基礎を深めるためには、テキストファイルとバイナリファイルの違いを理解することが重要です。本記事では、それぞれの特徴や操作方法について学びます。

0. 記事の概要

この記事を読むメリット

  • ファイル形式の理解:テキストファイルとバイナリファイルの違いや用途を理解できます。
  • 効率的なデータ操作:用途に応じた最適なファイル形式を選べるようになります。
  • 実践力の向上:それぞれの形式を操作する具体的な方法を習得できます。

この記事で学べること

  • テキストファイルとバイナリファイルの基本的な違い
  • 各形式の長所と短所
  • 操作方法の実践例

活用のイメージ

例えば、設定ファイルを扱う場合はテキスト形式が適しており、画像や音声データを扱う場合はバイナリ形式が効果的です。本記事を通じて、用途に応じたファイル形式を選べるスキルを身につけましょう。

1. テキストファイルとバイナリファイルの違い

1.1 テキストファイルとは?

テキストファイルは、人間が読める形式でデータを保存します。改行や空白文字などがそのまま保持され、主に文字列データを扱います。

例:ログファイル、設定ファイル(.txt、.csvなど)

1.2 バイナリファイルとは?

バイナリファイルは、データをバイト単位で保存する形式です。テキスト形式と異なり、人間が直接内容を読むことは困難ですが、データ量が少なく、高速に処理できます。

例:画像ファイル、音声ファイル、プログラムデータ(.png、.mp3、.exeなど)

1.3 テキスト形式とバイナリ形式の比較

特徴テキスト形式バイナリ形式
人間が読めるか読める読めない
データ量多い(冗長性が高い)少ない(効率的)
処理速度遅い高速
用途ログ、設定ファイル画像、音声、バイナリデータ

2. ファイル操作の基本

2.1 テキストファイルの操作

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w");
    if (file == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    fprintf(file, "Hello, World!\n");
    fprintf(file, "This is a text file.\n");

    fclose(file);
    printf("Text file written successfully.\n");
    return 0;
}
ポイント
  • テキストファイルの読み書きにはfprintf()fgets()を使用
  • 人間が読める形式で保存される

2.2 バイナリファイルの操作

#include <stdio.h>

int main() {
    FILE *file = fopen("example.bin", "wb");
    if (file == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    int data[] = {10, 20, 30, 40, 50};
    fwrite(data, sizeof(int), 5, file);

    fclose(file);
    printf("Binary file written successfully.\n");
    return 0;
}
ポイント
  • バイナリデータの保存にはfwrite()を使用
  • データ量が少なく高速に処理できる

2.3 テキスト形式とバイナリ形式の用途に応じた選択

どちらを選ぶべきかは用途によります。以下に選択基準を示します。

  • テキスト形式:データを目視で確認・編集したい場合(ログファイル、設定ファイル)
  • バイナリ形式:データ量を削減し、高速処理を行いたい場合(画像、音声、データベースファイル)

3. 練習問題

以下の課題に挑戦して、テキストファイルとバイナリファイルの違いを深く理解しましょう。

  1. テキストファイルに文字列を複数行書き込み、読み取って表示するプログラムを作成してください。
  2. バイナリファイルに数値データを保存し、読み取って平均値を計算するプログラムを作成してください。
  3. テキスト形式とバイナリ形式でデータ量や速度の違いを比較するプログラムを作成してください。

4. 練習問題の解答と解説

問2の解答

#include <stdio.h>

int main() {
    FILE *file = fopen("data.bin", "wb");
    if (file == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    int numbers[] = {10, 20, 30, 40, 50};
    fwrite(numbers, sizeof(int), 5, file);
    fclose(file);

    file = fopen("data.bin", "rb");
    if (file == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    int sum = 0, count = 0, num;
    while (fread(&num, sizeof(int), 1, file)) {
        sum += num;
        count++;
    }

    printf("Average: %.2f\n", (float)sum / count);
    fclose(file);
    return 0;
}

5. まとめ

テキストファイルとバイナリファイルの違いを理解することで、用途に応じた適切な形式を選べるようになります。次回は、ファイルシーク操作について学びます。