C言語

【C言語】第10章第3回:テキストエディタの基本実装

本記事では、C言語を用いてシンプルなテキストエディタを作成する方法を学びます。基本的なファイル操作から、簡易的な編集機能の実装までを解説します。

0. 記事の概要

この記事を読むメリット

  • ファイル操作の基礎理解:ファイルの読み書き操作を習得します。
  • システムプログラミングの実践:ターミナル上で動作するアプリケーションを構築できます。
  • 応用力の向上:より高度なエディタ機能の追加を視野に入れられます。

この記事で学べること

  • ファイルの読み書き処理
  • 文字列操作の基礎
  • ユーザーインタラクションの実装

1. テキストエディタの基本設計

1.1 エディタの機能

このテキストエディタでは以下の基本機能を実装します。

  • ファイルの読み込み
  • ファイルへの書き込み
  • テキストの編集(新しい行の追加)

1.2 必要なプログラム構造

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

  • ユーザーからの入力処理
  • ファイルの読み書き処理
  • エディタ機能の実装

2. コード例と詳細解説

2.1 基本コード例

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

void displayFile(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (!file) {
        printf("ファイルを開けませんでした: %s\\n", filename);
        return;
    }

    char line[256];
    printf("--- ファイル内容 ---\\n");
    while (fgets(line, sizeof(line), file)) {
        printf("%s", line);
    }
    fclose(file);
}

void appendToFile(const char *filename) {
    FILE *file = fopen(filename, "a");
    if (!file) {
        printf("ファイルを開けませんでした: %s\\n", filename);
        return;
    }

    char newLine[256];
    printf("追加するテキストを入力してください: ");
    fgets(newLine, sizeof(newLine), stdin);

    fprintf(file, "%s", newLine);
    fclose(file);
    printf("テキストがファイルに追加されました。\\n");
}

int main() {
    char filename[100];
    printf("編集するファイル名を入力してください: ");
    scanf("%s", filename);
    getchar(); // 改行文字をクリア

    int choice;
    do {
        printf("\\nメニュー:\\n");
        printf("1. ファイル内容を表示\\n");
        printf("2. テキストを追加\\n");
        printf("3. 終了\\n");
        printf("選択してください: ");
        scanf("%d", &choice);
        getchar(); // 改行文字をクリア

        switch (choice) {
            case 1:
                displayFile(filename);
                break;
            case 2:
                appendToFile(filename);
                break;
            case 3:
                printf("終了します。\\n");
                break;
            default:
                printf("無効な選択です。もう一度試してください。\\n");
        }
    } while (choice != 3);

    return 0;
}

動作解説

  1. ファイル表示機能:`displayFile`関数でファイルの内容を読み取り表示します。
  2. テキスト追加機能:`appendToFile`関数で新しい行をファイルに追加します。
  3. ユーザーインタラクション:`scanf`と`switch`文でメニュー選択を処理します。

3. 練習問題

以下の課題に挑戦して、テキストエディタを拡張してみましょう。

  1. 指定した行を削除する機能を追加してください。
  2. ファイル全体を新しい名前で保存する機能を追加してください。
  3. 行番号を表示しながらファイル内容を表示する機能を実装してください。

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

問1の解答例

// 指定行を削除する機能を実装
void deleteLine(const char *filename, int lineToDelete) {
    FILE *file = fopen(filename, "r");
    FILE *temp = fopen("temp.txt", "w");

    if (!file || !temp) {
        printf("ファイルを開けませんでした。\\n");
        return;
    }

    char line[256];
    int currentLine = 1;

    while (fgets(line, sizeof(line), file)) {
        if (currentLine != lineToDelete) {
            fprintf(temp, "%s", line);
        }
        currentLine++;
    }

    fclose(file);
    fclose(temp);

    remove(filename);
    rename("temp.txt", filename);
    printf("行番号 %d が削除されました。\\n", lineToDelete);
}

この関数では、一時ファイルを使用して指定した行を除外した新しいファイルを作成します。

5. まとめ

本記事では、C言語を用いた簡単なテキストエディタの実装方法を解説しました。さらに機能を追加して、より高度なエディタを作成してみましょう。