C# | 2週間で身につくアプリを作りながら学ぶC#の基本 - 8日目

C# C#
スポンサーリンク

8日目のゴールとテーマ

8日目のテーマは「ファイルに保存して“アプリの記憶”を持たせる」です。
これまでのアプリは、実行している間だけ動き、終了するとすべて消えていました。

今日はここに一歩踏み込んで、

  • テキストファイルに文字を書き出す
  • ファイルから文字を読み込む
  • 診断結果やスコアを“履歴”として残す

という「永続化」の入り口を体験します。

完璧に覚える必要はありません。
「C# でファイルに書ける・読める」という感覚が持てれば十分です。


ファイル入出力の全体イメージ

「コンソール」ではなく「ファイル」に書く

今までは、結果をすべてコンソールに表示していました。

Console.WriteLine("診断結果: ○○タイプです");
C#

これを「画面に出す」のではなく、「ファイルに書く」イメージです。

  • Console.WriteLine → 画面に表示
  • ファイル書き込み → ディスクに保存

どちらも「文字をどこかに送る」という意味では同じです。
送り先が「画面」か「ファイル」かの違いだけです。

8日目でやることの流れ

今日は、7日目の性格診断アプリを少し発展させて、

  • 診断結果をテキストとして組み立てる
  • そのテキストをファイルに保存する
  • アプリ起動時に「過去の診断履歴」を読み込んで表示する

という流れを作ります。


ファイルに文字を書き込む基本

File.WriteAllText を使う

C# では、System.IO.File クラスを使うと、
とても簡単にファイルの読み書きができます。

いちばんシンプルな書き込みはこれです。

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        string text = "こんにちは。これはファイルに書き込まれるテキストです。";

        File.WriteAllText("output.txt", text);

        Console.WriteLine("output.txt に書き込みました。");
    }
}
C#

ここでのポイントはこうです。

  • using System.IO; を先頭に書く(File クラスを使うため)
  • "output.txt" はファイル名(同じフォルダに作られる)
  • text の中身が、そのままファイルに書き込まれる

このコードを実行すると、プロジェクトの実行フォルダに output.txt ができて、
中にテキストが 1 行入っています。

上書きと追記の違い

File.WriteAllText は「そのファイルを丸ごと上書き」します。
毎回新しい内容だけを残したいときはこれで十分です。

一方、「履歴としてどんどん追加したい」ときは、
File.AppendAllText を使います。

File.AppendAllText("log.txt", "1回目の結果\n");
File.AppendAllText("log.txt", "2回目の結果\n");
C#

この場合、log.txt の中身は

1回目の結果
2回目の結果

というふうに増えていきます。


ファイルから文字を読み込む基本

File.ReadAllText を使う

今度は、ファイルの中身を読み込んでみます。

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        if (File.Exists("output.txt"))
        {
            string text = File.ReadAllText("output.txt");
            Console.WriteLine("ファイルの中身:");
            Console.WriteLine(text);
        }
        else
        {
            Console.WriteLine("output.txt がまだありません。");
        }
    }
}
C#

ここでのポイントはこうです。

  • File.Exists("output.txt") で「ファイルがあるかどうか」を確認している
  • File.ReadAllText は、ファイルの中身を丸ごと 1 つの文字列として読み込む
  • ファイルがないのに読み込もうとするとエラーになるので、Exists で守っている

「あるかどうかを確認してから読む」というのは、
ファイルを扱うときの基本パターンです。


診断結果を「文字列」として組み立てる

7日目の ShowResult を少し改造する

7日目の ShowResult は、コンソールに直接書いていました。
これを「文字列を返す」形に変えてみます。

static string BuildResultText(int yesCount, int total)
{
    string result = "";
    result += "=== 診断結果 ===\n";
    result += "「はい」と答えた数: " + yesCount + " / " + total + "\n";

    if (yesCount <= 1)
    {
        result += "あなたは超アクティブタイプです。\n";
        result += "外に出て新しいことをするのが好きなはず。\n";
    }
    else if (yesCount <= 3)
    {
        result += "あなたはバランスタイプです。\n";
        result += "家で過ごす時間も、外で過ごす時間も、どちらも楽しめるタイプです。\n";
    }
    else
    {
        result += "あなたはかなりインドアタイプです。\n";
        result += "家での時間を大事にしつつ、ときどき外の世界も覗いてみると新しい発見があるかも。\n";
    }

    return result;
}
C#

ここでの重要ポイントはこうです。

  • Console.WriteLine の代わりに、result という文字列に足している
  • \n は「改行」を表す特殊文字
  • 最後に return result; で、組み立てたテキストを返している

これで、「診断結果を 1 つの長い文字列として持つ」ことができます。

コンソール表示とファイル保存の両方に使う

Main 側では、こう使えます。

string resultText = BuildResultText(yesCount, questions.Length);

Console.WriteLine(resultText);

File.AppendAllText("history.txt", resultText + "\n");
C#

同じ resultText を、

  • コンソール表示用
  • ファイル保存用

の両方に使っているのがポイントです。


アプリ起動時に「過去の履歴」を表示する

履歴ファイルがあれば読み込んで見せる

アプリを起動したときに、
「これまでの診断結果」を最初に表示してみましょう。

static void ShowHistory()
{
    string fileName = "history.txt";

    if (File.Exists(fileName))
    {
        Console.WriteLine("=== 過去の診断履歴 ===");
        string history = File.ReadAllText(fileName);
        Console.WriteLine(history);
        Console.WriteLine("=== 履歴ここまで ===");
        Console.WriteLine();
    }
    else
    {
        Console.WriteLine("まだ診断履歴はありません。");
        Console.WriteLine();
    }
}
C#

Main の最初で、こう呼び出します。

static void Main(string[] args)
{
    ShowHistory();

    // ここから質問と診断を行う
}
C#

これで、

  • 初回起動 → 「まだ診断履歴はありません」
  • 2回目以降 → 過去の結果がずらっと表示される

という「ちょっとしたアプリ感」が出てきます。


8日目の完成イメージ(ざっくり全体像)

流れだけをまとめる

コード全体は長くなるので、ここでは流れだけ整理します。

Main
起動時に ShowHistory を呼ぶ
質問を配列で用意する
yesCount を数える(7日目と同じ AskYesNo を使う)
BuildResultText で診断結果の文字列を作る
Console.WriteLine で画面に表示
File.AppendAllText で history.txt に追記

ShowHistory
history.txt があれば ReadAllText で読み込んで表示
なければ「まだありません」と表示

BuildResultText
yesCount と total から診断メッセージを組み立てて、1 つの文字列として返す

ここまでできると、

「アプリを何度も実行しても、結果がファイルに残り続ける」

という「記憶を持ったアプリ」になります。


8日目のまとめ

今日のキーワードを整理します。

File.WriteAllText / AppendAllText
文字列をファイルに書き込む。Append は「追記」。

File.ReadAllText
ファイルの中身を丸ごと 1 つの文字列として読み込む。

File.Exists
ファイルが存在するかどうかを調べる。ないときに読むとエラーになるので、その前に確認する。

文字列として結果を組み立てる
Console.WriteLine で直接出すのではなく、1 つの string にまとめておくと、
画面表示にもファイル保存にも使い回せる。

ここまで来ると、「コンソールアプリだけど、ちゃんと履歴が残る」
一段階“アプリらしい”世界に入っています。


次回(9日目)への予告

9日目は、ファイル保存をもう少し発展させて、

  • 日付や時刻も一緒に保存する
  • ログっぽい形式にする
  • 簡単な「ログビューア」的な表示を工夫する

タイトルとURLをコピーしました