C#のStreamReaderとStreamWriterを使ったテキストファイル操作
生徒
「先生、C#でファイルに文字を書き込んだり、読み取ったりする方法を知りたいです!」
先生
「良い質問ですね。C#では、StreamReaderとStreamWriterというクラスを使って、テキストファイルの読み書きができますよ。」
生徒
「その2つはどう違うんですか?」
先生
「簡単に言えば、StreamWriterはファイルに書き込むためのクラス、StreamReaderはファイルを読むためのクラスです。それでは、実際の使い方を学んでみましょう!」
1. StreamReaderとStreamWriterとは?
StreamReaderとStreamWriterは、C#でテキストファイルを操作するための基本的なクラスです。どちらもSystem.IOという名前空間に含まれています。
これらのクラスを使うことで、ファイルを開いて内容を読み取ったり、新しいテキストを書き込んだりすることができます。たとえば、日記やメモ帳アプリのように「文字を保存したい」場合に非常に便利です。
ファイル操作はパソコンの世界で「入出力(I/O:Input/Output)」と呼ばれます。ファイルから読み取るのが「入力(Input)」、書き込むのが「出力(Output)」です。
2. ファイルに書き込む:StreamWriterの使い方
まずは、StreamWriterを使ってテキストファイルに文字を書き込む方法を見てみましょう。
using System;
using System.IO;
class Program
{
static void Main()
{
// ファイルに書き込む
using (StreamWriter writer = new StreamWriter("sample.txt"))
{
writer.WriteLine("こんにちは、C#の世界へようこそ!");
writer.WriteLine("StreamWriterを使うと、簡単にファイルに文字を書けます。");
}
Console.WriteLine("ファイルへの書き込みが完了しました。");
}
}
このプログラムを実行すると、同じフォルダ内に「sample.txt」というファイルが作成され、指定した文字列が書き込まれます。
ポイント:usingを使うことで、ファイルを自動的に閉じてくれるため、メモリの無駄やファイルロックの問題を防げます。
ファイルへの書き込みが完了しました。
ファイルの中身を開いてみると、次のようになっています。
こんにちは、C#の世界へようこそ!
StreamWriterを使うと、簡単にファイルに文字を書けます。
3. ファイルを読み込む:StreamReaderの使い方
次に、StreamReaderを使ってファイルの内容を読み取る方法を学びましょう。
using System;
using System.IO;
class Program
{
static void Main()
{
// ファイルを読み取る
using (StreamReader reader = new StreamReader("sample.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
}
ReadLine()メソッドは、ファイルを1行ずつ読み取る命令です。ファイルの終わりに達するとnull(何もない状態)を返すので、while文で最後まで読み取ることができます。
こんにちは、C#の世界へようこそ!
StreamWriterを使うと、簡単にファイルに文字を書けます。
このようにして、先ほど書き込んだ内容をコンソールに表示できます。つまり、StreamWriterで書き込み、StreamReaderで読み取るという流れになります。
4. ファイルの追記モードを使う
実際のアプリでは、既存のファイルに新しい情報を追加したい場合があります。たとえば、日記を毎日追記するようなケースです。そんなときは、StreamWriterのコンストラクタに「true」を指定して「追記モード(Append)」で開きます。
using (StreamWriter writer = new StreamWriter("sample.txt", true))
{
writer.WriteLine("この行は追記された内容です。");
}
このように書くと、既存の内容を消さずに新しい行が追加されます。trueを指定しない場合は、古い内容が上書きされてしまうので注意しましょう。
5. ファイルの存在確認とエラー対策
ファイル操作を行う際、対象のファイルが存在しないとエラー(例外)が発生します。そのため、File.Exists()メソッドを使って、ファイルが存在するかを確認してから読み込むようにするのが安全です。
if (File.Exists("sample.txt"))
{
using (StreamReader reader = new StreamReader("sample.txt"))
{
Console.WriteLine(reader.ReadToEnd());
}
}
else
{
Console.WriteLine("ファイルが見つかりません。");
}
ReadToEnd()メソッドを使うと、ファイル全体をまとめて読み取ることができます。短いテキストを一気に読みたいときに便利です。
6. 文字コードに注意しよう(UTF-8など)
ファイルの文字が「文字化け」する場合は、文字コード(エンコーディング)が原因のことがあります。日本語では「UTF-8」や「Shift-JIS」といった文字コードがよく使われます。
StreamWriterやStreamReaderは、文字コードを指定して開くこともできます。
using (StreamWriter writer = new StreamWriter("utf8.txt", false, System.Text.Encoding.UTF8))
{
writer.WriteLine("UTF-8で書き込みました。");
}
using (StreamReader reader = new StreamReader("utf8.txt", System.Text.Encoding.UTF8))
{
Console.WriteLine(reader.ReadToEnd());
}
このように明示的にエンコーディングを指定しておくと、異なる環境でも文字化けしにくくなります。
まとめ
StreamReaderとStreamWriterでできることの振り返り
この記事では、C#におけるテキストファイル操作の基本として、StreamReaderとStreamWriterの使い方を学んできました。 プログラミング初心者にとって、ファイル操作は少し難しく感じやすい分野ですが、仕組みを一つずつ理解すると決して特別なものではありません。 StreamWriterは「文字をファイルに書き込むための道具」、StreamReaderは「ファイルに書かれた文字を読み取るための道具」と考えると、とても分かりやすくなります。 実際のアプリケーションでは、設定ファイルを保存したり、ログを記録したり、ユーザーの入力内容を残したりと、テキストファイルの読み書きはさまざまな場面で活躍します。 そのため、StreamReaderとStreamWriterの基本を押さえておくことは、C#での開発を進める上で大きな土台になります。
書き込みと読み込みの流れを整理しよう
ファイル操作の流れとして大切なのは、「書き込む」と「読み込む」を明確に分けて考えることです。 まずStreamWriterを使ってファイルを開き、文字列を書き込み、処理が終わったら確実に閉じる。 次にStreamReaderを使って同じファイルを開き、内容を一行ずつ、またはまとめて読み取る。 using構文を使えば、ファイルを閉じ忘れる心配が減り、安全で安定したコードになります。 また、追記モードを使えば、既存の内容を残したまま新しい情報を追加できるため、日記や履歴管理のような処理にも応用できます。 これらの流れを頭の中で整理できるようになると、ファイル操作に対する不安は自然と小さくなっていきます。
サンプルとして覚えておきたい基本形
using System;
using System.IO;
class Program
{
static void Main()
{
using (StreamWriter writer = new StreamWriter("memo.txt"))
{
writer.WriteLine("ファイル操作の基本を学びました。");
}
using (StreamReader reader = new StreamReader("memo.txt"))
{
Console.WriteLine(reader.ReadToEnd());
}
}
}
このような形は、C#でのテキストファイル操作の基本形として覚えておくと便利です。 最初は意味が分からなくても、何度か書いて動かしているうちに、「ここで書いて、ここで読んでいる」という流れが自然に理解できるようになります。 大切なのは、完璧に暗記することではなく、「見たら思い出せる状態」を作ることです。
実務や学習で役立つ考え方
ファイル操作では、ファイルが存在しない場合や、文字コードの違いによる問題など、実際に使ってみないと気づきにくいポイントもあります。 そのため、Fileクラスを使った存在確認や、文字コードを明示的に指定する書き方を知っておくことは、とても重要です。 エラーが出たときに慌てるのではなく、「なぜそうなったのか」を一つずつ確認する姿勢が、プログラミング上達への近道になります。 StreamReaderとStreamWriterは、その練習に最適な題材とも言えます。
生徒
「最初はファイル操作って難しそうだと思っていましたが、書く用と読む用で役割が分かれていると分かって、少し安心しました。」
先生
「そうですね。StreamWriterとStreamReaderは役割がはっきりしているので、基本を押さえれば応用もしやすいですよ。」
生徒
「usingを使えば、自分で閉じる処理を書かなくてもいいのも便利だと思いました。実際のアプリでも使えそうですね。」
先生
「その通りです。ファイル操作は実務でもよく使いますから、今回学んだ内容は今後何度も役に立ちますよ。」
生徒
「これからは、ログを書いたり設定を保存したりする処理にも挑戦してみたいです。」
先生
「良い目標ですね。今日学んだStreamReaderとStreamWriterを土台に、少しずつできることを増やしていきましょう。」