【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;
}
動作解説
- データ登録:`addCustomer`関数で新しい顧客データを登録します。
- データ検索:`searchCustomer`関数で特定のIDを持つ顧客を検索します。
- データ表示:`displayAllCustomers`関数で全てのデータを一覧表示します。
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言語を用いて簡易データベースの基本的な作成方法を解説しました。さらに高度な機能を追加して、自分だけのデータベースツールを作成してみましょう。