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日目は、ファイル保存をもう少し発展させて、
- 日付や時刻も一緒に保存する
- ログっぽい形式にする
- 簡単な「ログビューア」的な表示を工夫する
