C言語

【C言語】第10章第6回:簡易データベースの実装

本記事では、C言語を用いてシンプルなデータベースを実装する方法を解説します。基本的なデータ構造やファイル操作を駆使して、データの登録、検索、削除を行うプログラムを作成します。

0. 記事の概要

この記事を読むメリット

  • データ操作の基本を学べる:登録、検索、削除の処理を実装する方法を学びます。
  • ファイル操作の実践的理解:データを永続的に保存する仕組みを学べます。
  • 構造体の応用力を向上:構造体を活用して、データ管理を効率化します。

この記事で学べること

  • データベースの基本設計
  • 構造体の活用方法
  • ファイル操作とデータの永続化

1. 簡易データベースの基本設計

1.1 データベースの機能

このデータベースプログラムでは以下の基本機能を実装します。

  • データの登録
  • データの検索
  • データの削除

1.2 データ構造

構造体を使用して、データを管理します。以下は、顧客情報を管理する例です。

typedef struct {
    int id;
    char name[50];
    char email[50];
} Customer;

1.3 必要なプログラム構造

プログラムは以下の主要部分で構成されます。

  • データの登録処理
  • 検索処理
  • 削除処理とデータの保存

2. コード例と詳細解説

2.1 基本コード例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int id;
    char name[50];
    char email[50];
} Customer;

void addCustomer(FILE *file) {
    Customer customer;
    printf("IDを入力してください: ");
    scanf("%d", &customer.id);
    getchar();
    printf("名前を入力してください: ");
    fgets(customer.name, sizeof(customer.name), stdin);
    customer.name[strcspn(customer.name, "\\n")] = 0; // 改行を削除
    printf("メールアドレスを入力してください: ");
    fgets(customer.email, sizeof(customer.email), stdin);
    customer.email[strcspn(customer.email, "\\n")] = 0;

    fwrite(&customer, sizeof(Customer), 1, file);
    printf("データが登録されました。\\n");
}

void searchCustomer(FILE *file, int id) {
    Customer customer;
    rewind(file);
    while (fread(&customer, sizeof(Customer), 1, file)) {
        if (customer.id == id) {
            printf("ID: %d\\n名前: %s\\nメールアドレス: %s\\n", customer.id, customer.name, customer.email);
            return;
        }
    }
    printf("指定されたIDのデータは見つかりませんでした。\\n");
}

void displayAllCustomers(FILE *file) {
    Customer customer;
    rewind(file);
    printf("登録されたデータ:\\n");
    while (fread(&customer, sizeof(Customer), 1, file)) {
        printf("ID: %d\\n名前: %s\\nメールアドレス: %s\\n", customer.id, customer.name, customer.email);
    }
}

int main() {
    FILE *file = fopen("database.dat", "r+b");
    if (!file) {
        file = fopen("database.dat", "w+b");
    }

    int choice, id;

    do {
        printf("\\nメニュー:\\n");
        printf("1. データ登録\\n");
        printf("2. データ検索\\n");
        printf("3. データ表示\\n");
        printf("4. 終了\\n");
        printf("選択してください: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                addCustomer(file);
                break;
            case 2:
                printf("検索するIDを入力してください: ");
                scanf("%d", &id);
                searchCustomer(file, id);
                break;
            case 3:
                displayAllCustomers(file);
                break;
            case 4:
                printf("終了します。\\n");
                break;
            default:
                printf("無効な選択です。\\n");
        }
    } while (choice != 4);

    fclose(file);
    return 0;
}
動作解説
  1. データ登録:`addCustomer`関数で新しい顧客データを登録します。
  2. データ検索:`searchCustomer`関数で特定のIDを持つ顧客を検索します。
  3. データ表示:`displayAllCustomers`関数で全てのデータを一覧表示します。

3. 練習問題

以下の課題に挑戦して、簡易データベースを拡張してみましょう。

  1. データ削除機能を追加してください。
  2. ファイルの内容をソートして表示する機能を追加してください。
  3. CSVファイルにエクスポートする機能を追加してください。

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

問1の解答例

// データ削除機能の実装
void deleteCustomer(FILE *file, int id) {
    FILE *tempFile = fopen("temp.dat", "w+b");
    Customer customer;
    int found = 0;

    rewind(file);
    while (fread(&customer, sizeof(Customer), 1, file)) {
        if (customer.id != id) {
            fwrite(&customer, sizeof(Customer), 1, tempFile);
        } else {
            found = 1;
        }
    }

    fclose(file);
    fclose(tempFile);

    remove("database.dat");
    rename("temp.dat", "database.dat");

    if (found) {
        printf("ID %d のデータが削除されました。\\n", id);
    } else {
        printf("指定されたIDのデータは見つかりませんでした。\\n");
    }
}

この関数では、一時ファイルを使用して指定されたIDを除外したデータを保存します。

5. まとめ

本記事では、C言語を用いて簡易データベースの基本的な作成方法を解説しました。さらに高度な機能を追加して、自分だけのデータベースツールを作成してみましょう。