C言語

【C言語】第7章第10回:ファイル操作を使ったプロジェクト例

ファイル操作の知識を活用して、実際のプロジェクトを作成します。本記事では、簡単なファイル操作のプロジェクト例を通じて実践的なスキルを磨きます。

0. 記事の概要

この記事を読むメリット

  • 実践力の向上:プロジェクトを通じてスキルを応用できます。
  • 学習の定着:実際に動くプログラムを作ることで理解が深まります。
  • 応用力の習得:プロジェクトを改良することでさらなるスキルアップが期待できます。

この記事で学べること

  • ファイル操作を活用したプロジェクトの設計方法
  • 実践的なファイル操作のプログラム例
  • プロジェクトを拡張するアイデア

活用のイメージ

例えば、CSVファイルを操作して顧客管理システムを構築したり、ログデータを解析するツールを作成したりする際に応用できます。

1. プロジェクト例:簡易ログ管理システム

1.1 プロジェクトの概要

このプロジェクトでは、以下の機能を持つログ管理システムを構築します。

  • 新しいログの追加
  • 既存ログの表示
  • ログデータの削除

1.2 プログラムコード

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

void addLog(const char *filename) {
    FILE *file = fopen(filename, "a"); // 追記モードでファイルを開く
    if (file == NULL) {
        printf("Error opening file.\n");
        return;
    }

    char log[100];
    printf("Enter log entry: ");
    fgets(log, sizeof(log), stdin);
    fprintf(file, "%s", log); // ファイルにログを追加
    fclose(file);
    printf("Log added successfully.\n");
}

void viewLogs(const char *filename) {
    FILE *file = fopen(filename, "r"); // 読み取りモードでファイルを開く
    if (file == NULL) {
        printf("No logs found.\n");
        return;
    }

    char buffer[100];
    printf("Logs:\n");
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);
    }
    fclose(file);
}

void deleteLogs(const char *filename) {
    if (remove(filename) == 0) {
        printf("Logs deleted successfully.\n");
    } else {
        printf("Error deleting logs.\n");
    }
}

int main() {
    const char *filename = "logs.txt";
    int choice;

    do {
        printf("\nLog Management System\n");
        printf("1. Add Log\n");
        printf("2. View Logs\n");
        printf("3. Delete Logs\n");
        printf("4. Exit\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);
        getchar(); // 改行文字を消費

        switch (choice) {
            case 1:
                addLog(filename);
                break;
            case 2:
                viewLogs(filename);
                break;
            case 3:
                deleteLogs(filename);
                break;
            case 4:
                printf("Exiting system.\n");
                break;
            default:
                printf("Invalid choice. Please try again.\n");
        }
    } while (choice != 4);

    return 0;
}
動作解説
  1. ログの追加:addLog()関数で、ログをファイルに追記します。
  2. ログの表示:viewLogs()関数で、ログを読み取って表示します。
  3. ログの削除:deleteLogs()関数で、ファイルを削除します。
  4. ユーザーインターフェース:選択肢を提供し、選択に応じて処理を実行します。

2. 練習問題

以下の課題に挑戦して、ファイル操作スキルを向上させましょう。

  1. ログの追加時に日時を自動的に記録する機能を追加してください。
  2. 指定したキーワードを含むログのみを検索して表示する機能を実装してください。
  3. ログを特定の形式(例:JSON形式)で保存する機能を追加してください。

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

問1の解答

#include <stdio.h>
#include <time.h>

void addLogWithTimestamp(const char *filename) {
    FILE *file = fopen(filename, "a");
    if (file == NULL) {
        printf("Error opening file.\n");
        return;
    }

    char log[100];
    time_t now = time(NULL);
    struct tm *t = localtime(&now);

    printf("Enter log entry: ");
    fgets(log, sizeof(log), stdin);
    fprintf(file, "[%04d-%02d-%02d %02d:%02d:%02d] %s", 
        t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
        t->tm_hour, t->tm_min, t->tm_sec, log);
    fclose(file);
    printf("Log with timestamp added successfully.\n");
}

int main() {
    addLogWithTimestamp("logs_with_timestamp.txt");
    return 0;
}
動作解説
  1. 日時の取得:time()localtime()で現在日時を取得します。
  2. ログの書き込み:日時情報をフォーマットしてログと一緒に保存します。

4. まとめ

本記事では、ファイル操作を使った簡易ログ管理システムを構築しました。練習問題を通じて、さらに高度な機能を実装することで、スキルを磨いてください。