【C#】Readの使い方を徹底解説|Console.Read・ReadLine・ファイル読み込みの違いまでわかる

はじめに

C#でコンソールアプリやファイル処理を学んでいると、ReadReadLineReadKeyReadAllTextStreamReader.Read など、似た名前のメソッドがたくさん登場します。

特に「csharp read」と検索する人の多くは、次のような疑問を持っているはずです。

Console.Read() は何を読み込むのか」
Read()ReadLine() は何が違うのか」
「なぜ Console.Read() の戻り値は int なのか」
「ファイルを読み込むときの Read はどれを使えばよいのか」

結論から言うと、C#の Read は「何かを読み取る」ためのメソッド名として広く使われています。ただし、読み取る対象がコンソール入力なのか、ファイルなのか、ストリームなのかによって使い方が大きく変わります。

この記事では、C#初心者が混同しやすい Console.ReadConsole.ReadLineConsole.ReadKeyFile.ReadAllTextStreamReader.Read などの違いを、サンプルコード付きでわかりやすく解説します。

1. C#のReadとは?検索ユーザーがまず知りたい基本

1-1. C#における「Read」は何を指すのか

C#における Read は、文字やデータを「読み込む」ためのメソッド名として使われます。

ただし、Read という名前だけで特定の1つの機能を指すわけではありません。たとえば、コンソールから入力を読む場合もあれば、テキストファイルから文字を読む場合もあります。

代表的なものには、次のようなメソッドがあります。

C#
Console.Read();
Console.ReadLine();
Console.ReadKey();

File.ReadAllText("sample.txt");
File.ReadAllLines("sample.txt");

StreamReader reader = new StreamReader("sample.txt");
reader.Read();
reader.ReadLine();
reader.ReadToEnd();

どれも「読む」処理ですが、読み込む単位や対象が異なります。

Console.Read() は標準入力から1文字を読み込みます。Console.ReadLine() は標準入力から1行分の文字列を読み込みます。File.ReadAllText() はファイル全体を文字列として読み込みます。StreamReader.ReadLine() はファイルなどのストリームから1行ずつ読み込みます。

つまり、C#で Read を理解するには、「どこから」「どの単位で」「どの型として」読み込むのかを整理することが重要です。

1-2. Console.Read・Console.ReadLine・StreamReader.Read・File.ReadAllTextの違い

C#でよく使うRead系メソッドは、目的ごとに分けて考えると理解しやすくなります。

Console.Read() は、コンソール入力から1文字分を読み取るメソッドです。戻り値は int 型で、読み取った文字の文字コードが返されます。

C#
int value = Console.Read();

Console.ReadLine() は、コンソール入力からEnterキーが押されるまでの1行分を文字列として読み取ります。

C#
string? text = Console.ReadLine();

StreamReader.Read() は、ファイルやストリームから1文字ずつ読み取ります。こちらも戻り値は int 型です。

C#
using StreamReader reader = new StreamReader("sample.txt");
int value = reader.Read();

File.ReadAllText() は、指定したファイルの内容をすべて読み込み、1つの文字列として返します。

C#
string text = File.ReadAllText("sample.txt");

同じ Read という名前が付いていても、使用場面は大きく異なります。コンソール入力なら Console、ファイル全体の読み込みなら File、1行ずつ効率よく読むなら StreamReader を使う、と覚えるとよいでしょう。

1-3. 「csharp read」で検索する人がつまずきやすいポイント

「csharp read」で検索する人がつまずきやすいポイントは、主に次の4つです。

1つ目は、Console.Read() が文字列を返すと思ってしまうことです。実際には Console.Read() の戻り値は int です。そのため、次のようなコードはエラーになります。

C#
string text = Console.Read(); // エラー

2つ目は、Console.Read()Console.ReadLine() の違いがわからないことです。Read() は1文字、ReadLine() は1行です。名前は似ていますが、入力の単位が違います。

3つ目は、数値入力の扱いです。Console.ReadLine() は文字列を返すため、数値として使いたい場合は int.Parseint.TryParse で変換する必要があります。

C#
string? input = Console.ReadLine();
int number = int.Parse(input);

4つ目は、ファイル読み込みの Read とコンソール入力の Read を混同することです。Console.Read() はキーボード入力向け、File.ReadAllText()StreamReader.ReadLine() はファイル読み込み向けです。

この違いを整理しておくと、C#のRead系メソッドで迷いにくくなります。

1-4. この記事で扱うRead系メソッドの全体像

この記事では、主に次のRead系メソッドを扱います。

C#
Console.Read()
Console.ReadLine()
Console.ReadKey()

File.ReadAllText()
File.ReadAllLines()

StreamReader.Read()
StreamReader.ReadLine()
StreamReader.ReadToEnd()

Console 系のメソッドは、キーボードからの入力を扱うときに使います。

File 系のメソッドは、ファイル全体をまとめて読み込むときに便利です。

StreamReader 系のメソッドは、ファイルを1文字ずつ、1行ずつ、または最後まで読み込むときに使います。特に大きなファイルを扱う場合は、File.ReadAllText() よりも StreamReader.ReadLine() のように少しずつ読み込む方法が向いています。

それでは、まず基本となる Console.Read() から見ていきましょう。

2. Console.Readの使い方

2-1. Console.Readの基本構文

Console.Read() は、コンソールから次の1文字を読み込むメソッドです。

基本構文は次のとおりです。

C#
int value = Console.Read();

戻り値は int 型です。読み込んだ文字そのものではなく、その文字を表す文字コードが返されます。

たとえば、コンソールで A と入力してEnterキーを押すと、Console.Read()A の文字コードである 65 を返します。

C#
int value = Console.Read();
Console.WriteLine(value);

入力例:

A

出力例:

65

Console.Read() は初心者向けの入力処理としては少し扱いにくいですが、「1文字単位で入力を読み取る」仕組みを理解するには重要なメソッドです。

2-2. Console.Readは1文字ずつ読み込むメソッド

Console.Read() は、入力された内容を1文字ずつ読み込みます。

たとえば、次のコードを見てください。

C#
int first = Console.Read();
int second = Console.Read();

Console.WriteLine(first);
Console.WriteLine(second);

コンソールに次のように入力したとします。

AB

この場合、最初の Console.Read()A を読み込み、2回目の Console.Read()B を読み込みます。

出力例は次のようになります。

65
66

A の文字コードは 65B の文字コードは 66 です。

注意点として、通常のコンソール入力では、Console.Read() を呼び出しても1文字入力した瞬間に処理が進むわけではありません。多くの場合、文字を入力したあとEnterキーを押すことで入力が確定します。

2-3. Console.Readの戻り値がint型になる理由

Console.Read() の戻り値は char ではなく int です。

その理由は、読み取る文字が存在しない場合に -1 を返す必要があるためです。

char 型は文字を表す型なので、-1 のような値を自然に扱えません。そのため、文字コードまたは終端を表す -1 を返せるように、戻り値が int 型になっています。

C#
int value = Console.Read();

if (value == -1)
{
Console.WriteLine("入力がありません。");
}
else
{
Console.WriteLine($"文字コード: {value}");
}

通常のキーボード入力では -1 を意識する場面は少ないですが、入力ストリームが終了した場合などに -1 が返る可能性があります。

この仕組みは、StreamReader.Read() でも同じです。C#のRead系メソッドでは、「1文字を読むが、読めない場合は -1 を返す」ために int が使われることがあります。

2-4. 読み取った文字をchar型に変換する方法

Console.Read() の戻り値は int ですが、文字として扱いたい場合は char 型にキャストします。

C#
int value = Console.Read();
char ch = (char)value;

Console.WriteLine(ch);

入力例:

A

出力例:

A

ただし、-1 が返る可能性を考えるなら、キャストする前にチェックするほうが安全です。

C#
int value = Console.Read();

if (value != -1)
{
char ch = (char)value;
Console.WriteLine($"入力された文字: {ch}");
}
else
{
Console.WriteLine("読み込める文字がありません。");
}

初心者のうちは、Console.Read() は「文字コードを返す」と覚えておきましょう。文字として使いたい場合は (char) で変換します。

2-5. Console.Readのサンプルコード

次のサンプルは、Console.Read() を使って1文字を読み込み、その文字コードと文字を表示する例です。

C#
using System;

class Program
{
static void Main()
{
Console.Write("1文字入力してください: ");

int value = Console.Read();

if (value != -1)
{
char ch = (char)value;

Console.WriteLine();
Console.WriteLine($"文字コード: {value}");
Console.WriteLine($"文字: {ch}");
}
else
{
Console.WriteLine("入力がありません。");
}
}
}

実行例:

1文字入力してください: A

文字コード: 65
文字: A

このコードでは、Console.Read() で取得した値をいったん int 型の value に代入しています。その後、(char)value によって文字に変換しています。

2-6. Console.Readが入力待ちになるタイミング

Console.Read() は、読み取る文字が入力バッファに存在しない場合、入力待ちになります。

入力バッファとは、ユーザーが入力した文字を一時的に保持しておく場所のようなものです。

たとえば、次のコードを実行します。

C#
int value = Console.Read();
Console.WriteLine(value);

この時点で入力済みの文字がなければ、プログラムはユーザーの入力を待ちます。ユーザーが文字を入力してEnterキーを押すと、入力された文字が読み込まれます。

一方で、すでに入力バッファに文字が残っている場合、Console.Read() は新しい入力を待たずに、その残っている文字を読み込みます。

この挙動は、Console.Read()Console.ReadLine() を混在させたときに混乱しやすいポイントです。

3. Console.ReadLineとの違い

3-1. Console.ReadLineは1行分の文字列を読み込む

Console.ReadLine() は、コンソールから1行分の入力を読み込むメソッドです。

基本構文は次のとおりです。

C#
string? input = Console.ReadLine();

Console.ReadLine() は、ユーザーが入力してEnterキーを押すまでの文字列を返します。

C#
Console.Write("名前を入力してください: ");
string? name = Console.ReadLine();

Console.WriteLine($"こんにちは、{name}さん");

実行例:

名前を入力してください: Taro
こんにちは、Taroさん

Console.Read() が1文字を読み込むのに対して、Console.ReadLine() は1行をまとめて読み込みます。

そのため、通常の文字列入力には Console.ReadLine() を使うことが多いです。

3-2. Console.ReadとConsole.ReadLineの戻り値の違い

Console.Read()Console.ReadLine() は、戻り値の型が異なります。

C#
int value = Console.Read();
string? line = Console.ReadLine();

Console.Read()int 型を返します。これは、読み込んだ1文字の文字コードです。

一方、Console.ReadLine()string? 型を返します。これは、入力された1行分の文字列です。

たとえば、ABC と入力した場合、Console.Read() は最初の1文字である A の文字コードを返します。

C#
int value = Console.Read();
Console.WriteLine(value);

入力:

ABC

出力:

65

一方、Console.ReadLine()ABC 全体を文字列として返します。

C#
string? line = Console.ReadLine();
Console.WriteLine(line);

入力:

ABC

出力:

ABC

この違いを理解していないと、Read() で文字列を取得しようとしてエラーになったり、ReadLine() の戻り値を数値として直接扱おうとしてエラーになったりします。

3-3. 改行文字や入力バッファの扱いの違い

Console.Read()Console.ReadLine() では、改行文字や入力バッファの扱いにも違いがあります。

Console.Read() は1文字だけ読み込みます。そのため、ユーザーが A と入力してEnterキーを押した場合、入力バッファには A だけでなく、Enterキーによる改行も残ることがあります。

C#
int value = Console.Read();
string? line = Console.ReadLine();

Console.WriteLine($"value: {value}");
Console.WriteLine($"line: {line}");

入力:

ABC

この場合、Console.Read()A を読み込みます。その後、Console.ReadLine() は残りの BC を読み込むことがあります。

つまり、Console.Read() を使ったあとに Console.ReadLine() を使うと、想定より短い文字列が読み込まれることがあります。

一方、Console.ReadLine() はEnterキーまでの1行をまとめて読み込み、通常は改行部分を含まない文字列を返します。

初心者が入力処理を安定させたい場合は、Console.Read()Console.ReadLine() を不用意に混在させないほうがよいでしょう。

3-4. 数値入力に使うならどちらがよいか

数値入力に使うなら、基本的には Console.ReadLine() を使うのがおすすめです。

理由は、ユーザーが入力した内容を文字列として受け取り、その後で数値に変換できるからです。

C#
Console.Write("年齢を入力してください: ");
string? input = Console.ReadLine();

int age = int.Parse(input);

Console.WriteLine($"年齢は{age}歳です。");

ただし、int.Parse は数値に変換できない文字列が入力されると FormatException を発生させます。

安全に処理するなら、int.TryParse を使います。

C#
Console.Write("年齢を入力してください: ");
string? input = Console.ReadLine();

if (int.TryParse(input, out int age))
{
Console.WriteLine($"年齢は{age}歳です。");
}
else
{
Console.WriteLine("数値を入力してください。");
}

Console.Read() は1文字の文字コードを返すため、数値入力にはあまり向いていません。

たとえば、ユーザーが 5 と入力した場合、Console.Read() の戻り値は数値の 5 ではなく、文字 '5' の文字コードである 53 です。

C#
int value = Console.Read();
Console.WriteLine(value);

入力:

5

出力:

53

このため、数値入力では Console.ReadLine() を使い、必要に応じて int.TryParse で変換する方法が実用的です。

3-5. Console.ReadとConsole.ReadLineの使い分け表

Console.Read()Console.ReadLine() の違いを整理すると、次のようになります。

メソッド読み込む単位戻り値主な用途
Console.Read()1文字int1文字の文字コードを読み取る
Console.ReadLine()1行string?名前、文章、数値入力などを読み取る

具体的な使い分けは次のとおりです。

1文字だけ読みたい場合は Console.Read() を使えます。

C#
int value = Console.Read();
char ch = (char)value;

1行分の文字列を読みたい場合は Console.ReadLine() を使います。

C#
string? text = Console.ReadLine();

数値を入力させたい場合も、基本的には Console.ReadLine() を使います。

C#
string? input = Console.ReadLine();

if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}

C#初心者の場合、ほとんどのコンソール入力は Console.ReadLine() で対応できます。

3-6. 初心者は基本的にConsole.ReadLineを使うべき理由

C#初心者は、基本的に Console.ReadLine() を使うのがおすすめです。

理由は大きく3つあります。

1つ目は、文字列として扱いやすいことです。Console.ReadLine() は入力された1行を string? として返すため、名前や文章などの入力にそのまま使えます。

2つ目は、数値入力にも応用しやすいことです。int.Parseint.TryParse を使えば、文字列を数値に変換できます。

C#
string? input = Console.ReadLine();
int number = int.Parse(input);

3つ目は、Console.Read() よりも挙動が直感的なことです。Console.Read() は1文字だけ読み込み、戻り値が文字コードになるため、初心者には少しわかりにくいです。

たとえば、次のような入力処理では Console.ReadLine() が自然です。

C#
Console.Write("名前: ");
string? name = Console.ReadLine();

Console.Write("年齢: ");
string? input = Console.ReadLine();

if (int.TryParse(input, out int age))
{
Console.WriteLine($"{name}さんは{age}歳です。");
}

一方で、Console.Read() は「1文字だけ読みたい」「文字コードを扱いたい」「標準入力を1文字ずつ処理したい」といった場面で使います。

4. Console.ReadKeyとの違い

4-1. Console.ReadKeyはキー入力を即座に取得する

Console.ReadKey() は、ユーザーが押したキーを取得するメソッドです。

基本構文は次のとおりです。

C#
ConsoleKeyInfo keyInfo = Console.ReadKey();

Console.Read()Console.ReadLine() は、通常Enterキーで入力を確定します。一方、Console.ReadKey() はキーが押された時点で取得できます。

たとえば、次のコードでは、ユーザーが何かキーを押すまで待機します。

C#
Console.WriteLine("何かキーを押してください...");
ConsoleKeyInfo keyInfo = Console.ReadKey();

Console.WriteLine();
Console.WriteLine($"押されたキー: {keyInfo.Key}");

実行中に A キーを押すと、ConsoleKey.A のような情報を取得できます。

キー操作を使ったメニューや、「何かキーを押したら終了」といった処理では Console.ReadKey() がよく使われます。

4-2. Enterキーが必要なConsole.Readとの違い

Console.Read()Console.ReadKey() の大きな違いは、Enterキーが必要かどうかです。

Console.Read() は標準入力から文字を読み取るため、多くのコンソール環境では文字を入力したあとEnterキーを押して入力を確定します。

C#
int value = Console.Read();

一方、Console.ReadKey() はキーが押された時点で処理が進みます。

C#
ConsoleKeyInfo keyInfo = Console.ReadKey();

そのため、次のような用途では Console.ReadKey() が便利です。

C#
Console.WriteLine("終了するには何かキーを押してください...");
Console.ReadKey();

このコードでは、ユーザーが任意のキーを押すだけで処理が進みます。Enterキーを押す必要はありません。

ただし、入力された文字列を取得したい場合は Console.ReadKey() ではなく、Console.ReadLine() を使うほうが適しています。

4-3. ReadKeyの戻り値ConsoleKeyInfoとは

Console.ReadKey() の戻り値は ConsoleKeyInfo 型です。

ConsoleKeyInfo には、押されたキーに関する情報が含まれます。

主に使うプロパティは次のとおりです。

プロパティ内容
Key押されたキーを表す ConsoleKey
KeyChar入力された文字
ModifiersShift、Alt、Ctrlなどの修飾キー情報

サンプルコードを見てみましょう。

C#
Console.WriteLine("キーを押してください:");
ConsoleKeyInfo keyInfo = Console.ReadKey();

Console.WriteLine();
Console.WriteLine($"Key: {keyInfo.Key}");
Console.WriteLine($"KeyChar: {keyInfo.KeyChar}");
Console.WriteLine($"Modifiers: {keyInfo.Modifiers}");

A キーを押した場合、環境によって表示は異なりますが、次のような結果になります。

Key: A
KeyChar: a
Modifiers: 0

Shiftキーを押しながら A を入力した場合は、ModifiersShift が含まれることがあります。

このように、Console.ReadKey() は単なる文字入力ではなく、「どのキーが押されたか」を扱いたい場合に便利です。

4-4. 「何かキーを押したら終了」で使う方法

コンソールアプリでは、処理の最後に「何かキーを押したら終了」と表示することがあります。

このような場合は、Console.ReadKey() を使うのが一般的です。

C#
Console.WriteLine("処理が完了しました。");
Console.WriteLine("何かキーを押すと終了します。");

Console.ReadKey();

Console.ReadLine() を使っても似たようなことはできます。

C#
Console.WriteLine("Enterキーを押すと終了します。");
Console.ReadLine();

ただし、Console.ReadLine() の場合はEnterキーを押す必要があります。

一方、Console.ReadKey() なら、Enterキー以外のキーでも処理を進められます。

また、押したキーを画面に表示したくない場合は、次のように true を指定します。

C#
Console.ReadKey(true);

この場合、ユーザーが押したキーはコンソールに表示されません。

4-5. Console.Read・ReadLine・ReadKeyの比較

Console.Read()Console.ReadLine()Console.ReadKey() の違いを整理すると、次のようになります。

メソッド読み込むもの戻り値Enterキー主な用途
Console.Read()1文字int基本的に必要1文字の文字コードを読む
Console.ReadLine()1行string?必要文字列や数値入力
Console.ReadKey()1つのキーConsoleKeyInfo不要キー操作、終了待ち

初心者が通常の入力処理で使うなら、まずは Console.ReadLine() を覚えるのがおすすめです。

1文字の入力を文字コードとして扱いたいなら Console.Read()、キーが押された瞬間に処理したいなら Console.ReadKey() を使います。

たとえば、用途別に考えると次のようになります。

C#
// 名前を入力
string? name = Console.ReadLine();

// 1文字を文字コードとして入力
int value = Console.Read();

// キー入力を待つ
ConsoleKeyInfo key = Console.ReadKey();

この3つを混同しないことが、C#のコンソール入力を理解する第一歩です。

5. C#でファイルを読み込むRead系メソッド

5-1. File.ReadAllTextでファイル全体を読み込む

C#でテキストファイル全体を一度に読み込みたい場合は、File.ReadAllText() が便利です。

C#
string text = File.ReadAllText("sample.txt");
Console.WriteLine(text);

File.ReadAllText() は、指定したファイルの内容をすべて読み込み、1つの文字列として返します。

たとえば、sample.txt に次の内容があるとします。

Hello
C#
Read

次のコードを実行します。

C#
string text = File.ReadAllText("sample.txt");
Console.WriteLine(text);

出力は次のようになります。

Hello
C#
Read

短い設定ファイルや小さなテキストファイルを読み込む場合には、とてもシンプルで使いやすい方法です。

ただし、ファイル全体をメモリに読み込むため、非常に大きなファイルには向いていない場合があります。大きなログファイルなどを扱う場合は、StreamReader.ReadLine() で1行ずつ読み込む方法を検討しましょう。

5-2. File.ReadAllLinesで行ごとに配列として読み込む

File.ReadAllLines() は、テキストファイルを行ごとに読み込み、文字列配列として返します。

C#
string[] lines = File.ReadAllLines("sample.txt");

サンプルコードは次のとおりです。

C#
string[] lines = File.ReadAllLines("sample.txt");

foreach (string line in lines)
{
Console.WriteLine(line);
}

sample.txt の内容が次の場合、

Apple
Banana
Orange

ReadAllLines() は次のような配列を返します。

C#
["Apple", "Banana", "Orange"]

行単位で処理したい場合には、File.ReadAllText() よりも File.ReadAllLines() のほうが扱いやすいことがあります。

ただし、こちらもすべての行を一度にメモリへ読み込みます。ファイルが大きい場合は、StreamReader.ReadLine() を使って1行ずつ処理するほうが効率的です。

5-3. StreamReader.Readで1文字ずつ読み込む

StreamReader.Read() は、ファイルやストリームから1文字ずつ読み込むメソッドです。

C#
using StreamReader reader = new StreamReader("sample.txt");

int value = reader.Read();

Console.Read() と同じく、戻り値は int 型です。読み込んだ文字の文字コードが返され、読み込む文字がない場合は -1 が返されます。

次のサンプルでは、ファイルの内容を1文字ずつ読み込んで表示します。

C#
using System;
using System.IO;

class Program
{
static void Main()
{
using StreamReader reader = new StreamReader("sample.txt");

int value;

while ((value = reader.Read()) != -1)
{
char ch = (char)value;
Console.Write(ch);
}
}
}

このコードでは、reader.Read()-1 を返すまでループしています。

StreamReader.Read() は1文字ずつ細かく処理したい場合に使います。ただし、通常のテキスト処理では、1文字ずつ読むよりも ReadLine() で1行ずつ読むほうが実用的なことが多いです。

5-4. StreamReader.ReadLineで1行ずつ読み込む

StreamReader.ReadLine() は、ファイルを1行ずつ読み込むメソッドです。

C#
using StreamReader reader = new StreamReader("sample.txt");

string? line = reader.ReadLine();

ファイルを最後まで1行ずつ読み込むには、次のように書きます。

C#
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() は、読み込む行がなくなると null を返します。

そのため、次のような条件でループするのが一般的です。

C#
while ((line = reader.ReadLine()) != null)
{
// 1行ずつ処理
}

ログファイル、CSVファイル、設定ファイルなどを行単位で処理したい場合に便利です。

大きなファイルでも、1行ずつ読み込めばファイル全体を一度にメモリへ載せる必要がありません。

5-5. StreamReader.ReadToEndで最後まで読み込む

StreamReader.ReadToEnd() は、現在位置からストリームの最後までをまとめて読み込むメソッドです。

C#
using StreamReader reader = new StreamReader("sample.txt");

string text = reader.ReadToEnd();
Console.WriteLine(text);

File.ReadAllText() と似ていますが、StreamReader を使っている点が異なります。

たとえば、エンコーディングを指定したい場合や、既に開いているストリームから読み込みたい場合に StreamReader.ReadToEnd() が使われます。

C#
using StreamReader reader = new StreamReader("sample.txt", System.Text.Encoding.UTF8);

string text = reader.ReadToEnd();

Console.WriteLine(text);

ただし、ReadToEnd() も残りの内容をすべて文字列として読み込むため、大きなファイルではメモリ使用量に注意が必要です。

大量データを扱う場合は、ReadLine() で1行ずつ処理するほうが安全です。

5-6. ファイル読み込みでusingを使う理由

ファイル読み込みで StreamReader を使う場合、基本的には using を使います。

C#
using StreamReader reader = new StreamReader("sample.txt");

string text = reader.ReadToEnd();

using を使う理由は、ファイルを開いたあとに確実に閉じるためです。

ファイルを開いたままにしておくと、他のプログラムからそのファイルを操作できなかったり、リソースが解放されなかったりする可能性があります。

以前の書き方では、次のようにブロック形式で書くこともあります。

C#
using (StreamReader reader = new StreamReader("sample.txt"))
{
string text = reader.ReadToEnd();
Console.WriteLine(text);
}

このブロックを抜けると、自動的に reader.Dispose() が呼び出され、ファイルが閉じられます。

C#では、ファイルやネットワークなど外部リソースを扱うオブジェクトは、使い終わったら解放する必要があります。using を使うことで、解放漏れを防げます。

6. Console.Readとファイル読み込みの違い

6-1. 標準入力から読む場合とファイルから読む場合の違い

C#のRead系メソッドは、「どこから読むか」によって大きく分かれます。

Console.Read()Console.ReadLine() は、標準入力から読み込みます。標準入力とは、通常はキーボードからの入力を指します。

C#
string? input = Console.ReadLine();

一方、File.ReadAllText()StreamReader.ReadLine() は、ファイルから読み込みます。

C#
string text = File.ReadAllText("sample.txt");

標準入力は、ユーザーが実行中に入力するデータです。ファイル入力は、あらかじめ保存されているデータをプログラムが読み込むものです。

同じ「Read」でも、ユーザー入力を処理したいのか、テキストファイルを処理したいのかで選ぶメソッドが変わります。

6-2. Console.Readはキーボード入力向け

Console.Read() は、コンソールから1文字を読み取るためのメソッドです。

主な用途は、キーボードから入力された文字を1文字だけ取得することです。

C#
Console.Write("1文字入力してください: ");
int value = Console.Read();

char ch = (char)value;
Console.WriteLine($"入力: {ch}");

ただし、実際のアプリケーションでは、Console.Read() よりも Console.ReadLine() を使うことが多いです。

理由は、ユーザーの入力は1文字よりも1行単位で受け取ることが多いからです。

C#
Console.Write("名前を入力してください: ");
string? name = Console.ReadLine();

Console.Read() は、C#の学習や標準入力を1文字ずつ処理したい場面では役立ちますが、通常の入力フォームのような使い方にはあまり向いていません。

6-3. File・StreamReaderはテキストファイル読み込み向け

ファイルを読み込む場合は、File クラスや StreamReader クラスを使います。

ファイル全体をまとめて読み込みたい場合は、File.ReadAllText() が便利です。

C#
string text = File.ReadAllText("sample.txt");

行ごとに配列として読みたい場合は、File.ReadAllLines() を使います。

C#
string[] lines = File.ReadAllLines("sample.txt");

大きなファイルを1行ずつ処理したい場合は、StreamReader.ReadLine() を使います。

C#
using StreamReader reader = new StreamReader("sample.txt");

string? line;

while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}

File クラスは簡単に書けるのがメリットです。一方、StreamReader は少しずつ読み込めるため、大きなファイルや逐次処理に向いています。

6-4. 用途別に選ぶべきReadメソッド

C#のRead系メソッドは、用途に合わせて選ぶことが重要です。

ユーザーから1行入力してもらうなら、Console.ReadLine() を使います。

C#
string? input = Console.ReadLine();

1文字だけ読みたいなら、Console.Read() を使います。

C#
int value = Console.Read();

キー入力を待ちたいなら、Console.ReadKey() を使います。

C#
Console.ReadKey();

ファイル全体を文字列として読みたいなら、File.ReadAllText() を使います。

C#
string text = File.ReadAllText("sample.txt");

ファイルを1行ずつ読みたいなら、StreamReader.ReadLine() を使います。

C#
using StreamReader reader = new StreamReader("sample.txt");

string? line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}

「Read」という名前だけで判断するのではなく、「入力元」と「読み込む単位」を意識して選びましょう。

6-5. 「Read」と名前が付くメソッドを混同しないための整理

C#には Read と名前が付くメソッドが多くあります。混同しないためには、次のように整理するとわかりやすいです。

分類メソッド読み込む対象読み込む単位
コンソールConsole.Read()標準入力1文字
コンソールConsole.ReadLine()標準入力1行
コンソールConsole.ReadKey()キー入力1キー
ファイルFile.ReadAllText()テキストファイル全体
ファイルFile.ReadAllLines()テキストファイル全行
ストリームStreamReader.Read()ファイルなど1文字
ストリームStreamReader.ReadLine()ファイルなど1行
ストリームStreamReader.ReadToEnd()ファイルなど最後まで

この表を見れば、Read という名前が同じでも、使い方が異なることがわかります。

特に初心者は、次のように覚えるとよいでしょう。

コンソール入力なら Console.ReadLine()

ファイル全体なら File.ReadAllText()

ファイルを1行ずつなら StreamReader.ReadLine()

この3つを押さえておけば、多くの場面に対応できます。

7. C#のReadでよくあるエラーと対処法

7-1. Console.Readの戻り値をstringに代入してしまう

Console.Read()int 型を返します。そのため、戻り値を string に直接代入することはできません。

間違った例:

C#
string input = Console.Read();

このコードはコンパイルエラーになります。Console.Read() が返すのは文字列ではなく、読み込んだ1文字の文字コードだからです。

正しくは、次のように int 型で受け取ります。

C#
int value = Console.Read();

文字として扱いたい場合は、char に変換します。

C#
int value = Console.Read();

if (value != -1)
{
char ch = (char)value;
Console.WriteLine(ch);
}

文字列として入力を受け取りたい場合は、Console.Read() ではなく Console.ReadLine() を使いましょう。

C#
string? input = Console.ReadLine();

7-2. Console.ReadLineの戻り値をintに直接代入してしまう

Console.ReadLine()string? 型を返します。そのため、戻り値を int に直接代入することはできません。

間違った例:

C#
int number = Console.ReadLine();

このコードはコンパイルエラーになります。

数値として扱いたい場合は、文字列から数値へ変換する必要があります。

C#
string? input = Console.ReadLine();
int number = int.Parse(input);

ただし、int.Parse は入力が数値ではない場合に例外を発生させます。

より安全に書くなら、int.TryParse を使います。

C#
string? input = Console.ReadLine();

if (int.TryParse(input, out int number))
{
Console.WriteLine($"入力された数値: {number}");
}
else
{
Console.WriteLine("数値を入力してください。");
}

初心者向けには、数値入力では TryParse を使う書き方を覚えておくと安心です。

7-3. 数値入力でFormatExceptionが発生する

FormatException は、文字列を数値に変換しようとしたとき、形式が正しくない場合に発生します。

たとえば、次のコードを見てください。

C#
Console.Write("数値を入力してください: ");
string? input = Console.ReadLine();

int number = int.Parse(input);

Console.WriteLine(number);

ここでユーザーが abc と入力すると、int.Parseabc を整数に変換できないため、FormatException が発生します。

安全に処理するには、int.TryParse を使います。

C#
Console.Write("数値を入力してください: ");
string? input = Console.ReadLine();

if (int.TryParse(input, out int number))
{
Console.WriteLine($"入力された数値: {number}");
}
else
{
Console.WriteLine("正しい数値を入力してください。");
}

TryParse は、変換に成功した場合は true、失敗した場合は false を返します。失敗しても例外が発生しないため、ユーザー入力のチェックに向いています。

小数を扱いたい場合は、double.TryParse を使います。

C#
string? input = Console.ReadLine();

if (double.TryParse(input, out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("小数として認識できません。");
}

7-4. 入力バッファに文字が残って想定外の読み込みになる

Console.Read() は1文字だけ読み込むため、入力バッファに残った文字が次の入力処理に影響することがあります。

たとえば、次のコードを見てください。

C#
Console.Write("1文字入力してください: ");
int value = Console.Read();

Console.Write("次に文字列を入力してください: ");
string? text = Console.ReadLine();

Console.WriteLine($"value: {(char)value}");
Console.WriteLine($"text: {text}");

ユーザーが最初に ABC と入力してEnterキーを押すと、Console.Read()A だけを読み込みます。その後の Console.ReadLine() は、残っている BC を読み込む可能性があります。

そのため、2回目の入力を待たずに処理が進んだように見えることがあります。

対処法の1つは、Console.Read()Console.ReadLine() を混在させないことです。通常の入力処理では Console.ReadLine() に統一すると、挙動がわかりやすくなります。

どうしても Console.Read() のあとに残りの行を捨てたい場合は、追加で Console.ReadLine() を呼び出してバッファを消費します。

C#
int value = Console.Read();
Console.ReadLine(); // 残りの入力を読み捨てる

string? text = Console.ReadLine();

ただし、このようなコードは初心者にはわかりにくいため、まずは Console.ReadLine() を中心に使うことをおすすめします。

7-5. ファイルが見つからないFileNotFoundExceptionへの対処

ファイルを読み込むとき、指定したファイルが存在しないと FileNotFoundException が発生することがあります。

たとえば、次のコードで sample.txt が存在しない場合です。

C#
string text = File.ReadAllText("sample.txt");

対処法として、読み込む前に File.Exists() でファイルの存在を確認します。

C#
string path = "sample.txt";

if (File.Exists(path))
{
string text = File.ReadAllText(path);
Console.WriteLine(text);
}
else
{
Console.WriteLine("ファイルが見つかりません。");
}

また、相対パスを使っている場合は、実行時のカレントディレクトリに注意が必要です。

C#
Console.WriteLine(Directory.GetCurrentDirectory());

このコードで、プログラムがどのフォルダを基準にファイルを探しているか確認できます。

ファイルが存在するはずなのに見つからない場合は、パスの指定が間違っていることが多いです。絶対パスを使うと確認しやすくなります。

C#
string path = @"C:\temp\sample.txt";

文字列の前に @ を付けると、バックスラッシュをエスケープせずに書けます。

7-6. 文字化けが起きる場合のEncoding指定

ファイル読み込みで文字化けが起きる場合は、文字エンコーディングが原因のことがあります。

たとえば、UTF-8で保存されたファイルを読み込む場合は、次のようにエンコーディングを指定できます。

C#
using System.Text;

string text = File.ReadAllText("sample.txt", Encoding.UTF8);
Console.WriteLine(text);

StreamReader でもエンコーディングを指定できます。

C#
using System.Text;

using StreamReader reader = new StreamReader("sample.txt", Encoding.UTF8);

string text = reader.ReadToEnd();
Console.WriteLine(text);

古い日本語ファイルでは、Shift_JISが使われている場合もあります。

C#
using System.Text;

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

string text = File.ReadAllText("sample.txt", Encoding.GetEncoding("shift_jis"));
Console.WriteLine(text);

.NET Coreや.NET 5以降でShift_JISなどのコードページを使う場合は、System.Text.Encoding.CodePages パッケージが必要になることがあります。

文字化けが起きたときは、ファイルがどの文字コードで保存されているかを確認し、それに合わせて Encoding を指定しましょう。

8. 実践サンプルで学ぶReadの使い方

8-1. Console.Readで1文字入力を受け取るサンプル

次のサンプルは、Console.Read() を使って1文字入力を受け取る例です。

C#
using System;

class Program
{
static void Main()
{
Console.Write("好きなアルファベットを1文字入力してください: ");

int value = Console.Read();

if (value != -1)
{
char ch = (char)value;

Console.WriteLine();
Console.WriteLine($"入力された文字: {ch}");
Console.WriteLine($"文字コード: {value}");
}
else
{
Console.WriteLine("入力がありませんでした。");
}
}
}

実行例:

好きなアルファベットを1文字入力してください: A

入力された文字: A
文字コード: 65

このサンプルでは、Console.Read() の戻り値を int として受け取り、char に変換しています。

Console.Read() は文字列入力ではなく、1文字の読み取りに使う点を意識しましょう。

8-2. Console.ReadLineで名前や文字列を入力するサンプル

名前や文章などの文字列を入力する場合は、Console.ReadLine() が適しています。

C#
using System;

class Program
{
static void Main()
{
Console.Write("名前を入力してください: ");
string? name = Console.ReadLine();

Console.WriteLine($"こんにちは、{name}さん!");
}
}

実行例:

名前を入力してください: Hanako
こんにちは、Hanakoさん!

Console.ReadLine() は、ユーザーがEnterキーを押すまでの入力を文字列として返します。

複数の入力を受け取る場合も、次のように書けます。

C#
Console.Write("姓を入力してください: ");
string? lastName = Console.ReadLine();

Console.Write("名を入力してください: ");
string? firstName = Console.ReadLine();

Console.WriteLine($"フルネーム: {lastName} {firstName}");

文字列入力では、基本的に Console.ReadLine() を使うと覚えておきましょう。

8-3. ReadLineで数値を受け取って計算するサンプル

Console.ReadLine() で受け取った値は文字列です。計算に使うには数値に変換します。

次のサンプルでは、2つの整数を入力して合計を表示します。

C#
using System;

class Program
{
static void Main()
{
Console.Write("1つ目の数値を入力してください: ");
string? input1 = Console.ReadLine();

Console.Write("2つ目の数値を入力してください: ");
string? input2 = Console.ReadLine();

int number1 = int.Parse(input1);
int number2 = int.Parse(input2);

int sum = number1 + number2;

Console.WriteLine($"合計: {sum}");
}
}

実行例:

1つ目の数値を入力してください: 10
2つ目の数値を入力してください: 20
合計: 30

ただし、このコードでは数値以外が入力されるとエラーになります。

安全にするなら、int.TryParse を使います。

C#
using System;

class Program
{
static void Main()
{
Console.Write("数値を入力してください: ");
string? input = Console.ReadLine();

if (int.TryParse(input, out int number))
{
Console.WriteLine($"2倍すると: {number * 2}");
}
else
{
Console.WriteLine("数値を入力してください。");
}
}
}

ユーザー入力を扱う場合は、常に想定外の入力があると考えて、TryParse を使うと安全です。

8-4. File.ReadAllTextでテキストファイルを表示するサンプル

次のサンプルは、File.ReadAllText() を使ってテキストファイル全体を読み込み、コンソールに表示する例です。

C#
using System;
using System.IO;

class Program
{
static void Main()
{
string path = "sample.txt";

if (File.Exists(path))
{
string text = File.ReadAllText(path);
Console.WriteLine(text);
}
else
{
Console.WriteLine("ファイルが見つかりません。");
}
}
}

sample.txt の内容:

C#のReadを学習しています。
File.ReadAllTextを使うと、
ファイル全体を読み込めます。

出力例:

C#のReadを学習しています。
File.ReadAllTextを使うと、
ファイル全体を読み込めます。

File.Exists() を使って事前にファイルの存在を確認しているため、ファイルがない場合にもわかりやすいメッセージを表示できます。

短いテキストファイルを読み込むだけなら、File.ReadAllText() は非常に便利です。

8-5. StreamReader.ReadLineでCSVやログを1行ずつ読むサンプル

CSVファイルやログファイルを1行ずつ処理したい場合は、StreamReader.ReadLine() が便利です。

次の例では、CSVファイルを1行ずつ読み込み、カンマで分割します。

C#
using System;
using System.IO;

class Program
{
static void Main()
{
string path = "users.csv";

if (!File.Exists(path))
{
Console.WriteLine("ファイルが見つかりません。");
return;
}

using StreamReader reader = new StreamReader(path);

string? line;

while ((line = reader.ReadLine()) != null)
{
string[] columns = line.Split(',');

foreach (string column in columns)
{
Console.Write($"{column} ");
}

Console.WriteLine();
}
}
}

users.csv の例:

1,Taro,taro@example.com
2,Hanako,hanako@example.com
3,Jiro,jiro@example.com

出力例:

1 Taro taro@example.com
2 Hanako hanako@example.com
3 Jiro jiro@example.com

本格的なCSV処理では、カンマを含む値やダブルクォーテーションの扱いも考慮する必要があります。ただし、単純なCSVやログファイルであれば、ReadLine() で1行ずつ読み込む方法がわかりやすいです。

ログファイルを読む場合も同じように書けます。

C#
using StreamReader reader = new StreamReader("app.log");

string? line;

while ((line = reader.ReadLine()) != null)
{
if (line.Contains("ERROR"))
{
Console.WriteLine(line);
}
}

この例では、ログの中から ERROR を含む行だけを表示しています。

8-6. 入力値チェックを入れた安全なサンプル

ユーザー入力を扱う場合は、入力値チェックを入れることが重要です。

次のサンプルでは、年齢を入力してもらい、正しい数値かどうかを確認します。

C#
using System;

class Program
{
static void Main()
{
Console.Write("年齢を入力してください: ");
string? input = Console.ReadLine();

if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("入力が空です。");
return;
}

if (!int.TryParse(input, out int age))
{
Console.WriteLine("数値を入力してください。");
return;
}

if (age < 0)
{
Console.WriteLine("年齢は0以上で入力してください。");
return;
}

Console.WriteLine($"入力された年齢: {age}");
}
}

このコードでは、次のチェックを行っています。

チェック内容方法
空文字チェックstring.IsNullOrWhiteSpace
数値変換チェックint.TryParse
範囲チェックage < 0

コンソールアプリの学習では、単純に int.Parse を使う例がよく出てきます。しかし、実際のアプリケーションでは、ユーザーが必ず正しい値を入力するとは限りません。

安全なコードを書くなら、ReadLine() で文字列を受け取り、TryParse で変換し、必要に応じて範囲チェックを行いましょう。

9. Read系メソッドの使い分け早見表

9-1. 1文字だけ読みたい場合

1文字だけ読みたい場合は、Console.Read() または StreamReader.Read() を使います。

キーボードから1文字読みたい場合は Console.Read() です。

C#
int value = Console.Read();

if (value != -1)
{
char ch = (char)value;
Console.WriteLine(ch);
}

ファイルから1文字ずつ読みたい場合は StreamReader.Read() です。

C#
using StreamReader reader = new StreamReader("sample.txt");

int value;

while ((value = reader.Read()) != -1)
{
char ch = (char)value;
Console.Write(ch);
}

ただし、通常の入力処理では、1文字単位よりも1行単位で読むことのほうが多いです。

9-2. 1行の文字列を読みたい場合

1行の文字列を読みたい場合は、Console.ReadLine() を使います。

C#
Console.Write("メッセージを入力してください: ");
string? message = Console.ReadLine();

Console.WriteLine($"入力内容: {message}");

数値入力でも、まずは ReadLine() で文字列として受け取ります。

C#
string? input = Console.ReadLine();

if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}

C#初心者がコンソール入力で最初に覚えるべきメソッドは、基本的に Console.ReadLine() です。

9-3. キー入力を待ちたい場合

キー入力を待ちたい場合は、Console.ReadKey() を使います。

C#
Console.WriteLine("何かキーを押してください...");
Console.ReadKey();

押されたキーを表示したくない場合は、true を指定します。

C#
Console.ReadKey(true);

押されたキーに応じて処理を分けることもできます。

C#
Console.WriteLine("YまたはNを押してください。");

ConsoleKeyInfo keyInfo = Console.ReadKey(true);

if (keyInfo.Key == ConsoleKey.Y)
{
Console.WriteLine("Yesが選択されました。");
}
else if (keyInfo.Key == ConsoleKey.N)
{
Console.WriteLine("Noが選択されました。");
}
else
{
Console.WriteLine("YまたはNではありません。");
}

メニュー操作や終了待ちには、Console.ReadKey() が便利です。

9-4. ファイル全体を読みたい場合

ファイル全体を読みたい場合は、File.ReadAllText() を使います。

C#
string text = File.ReadAllText("sample.txt");
Console.WriteLine(text);

行ごとに配列として扱いたい場合は、File.ReadAllLines() を使います。

C#
string[] lines = File.ReadAllLines("sample.txt");

foreach (string line in lines)
{
Console.WriteLine(line);
}

短いファイルや設定ファイルを読み込む場合は、File.ReadAllText()File.ReadAllLines() が簡単です。

ただし、ファイルが大きい場合は、メモリ使用量が増える可能性があります。

9-5. ファイルを1行ずつ読みたい場合

ファイルを1行ずつ読みたい場合は、StreamReader.ReadLine() を使います。

C#
using StreamReader reader = new StreamReader("sample.txt");

string? line;

while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}

この方法では、ファイル全体を一度に読み込まず、1行ずつ処理できます。

ログファイルの解析やCSVの読み込みなどに向いています。

C#
using StreamReader reader = new StreamReader("app.log");

string? line;

while ((line = reader.ReadLine()) != null)
{
if (line.Contains("ERROR"))
{
Console.WriteLine(line);
}
}

ファイルのサイズが大きくなる可能性がある場合は、File.ReadAllText() よりも StreamReader.ReadLine() を検討しましょう。

9-6. 大きなファイルを効率よく読みたい場合

大きなファイルを効率よく読みたい場合は、一度にすべて読み込まず、少しずつ処理することが重要です。

代表的な方法は、StreamReader.ReadLine() で1行ずつ読む方法です。

C#
using StreamReader reader = new StreamReader("large.log");

string? line;

while ((line = reader.ReadLine()) != null)
{
// 1行ずつ処理する
if (line.Contains("ERROR"))
{
Console.WriteLine(line);
}
}

この方法なら、ファイル全体をメモリに載せる必要がありません。

一方、次のようなコードはファイル全体を一度に読み込むため、大きなファイルには注意が必要です。

C#
string text = File.ReadAllText("large.log");

もちろん、小さなファイルであれば問題ありません。重要なのは、ファイルサイズや処理内容に応じてメソッドを選ぶことです。

大きなファイルでは StreamReader.ReadLine()、小さなファイルでは File.ReadAllText() と覚えるとよいでしょう。

10. C#のReadに関するよくある質問

10-1. Console.Readはなぜintを返すのか

Console.Read()int を返すのは、読み込んだ文字の文字コードと、読み込めない場合の -1 を表現するためです。

たとえば、A を入力すると、Console.Read()65 を返します。

C#
int value = Console.Read();
Console.WriteLine(value);

入力:

A

出力:

65

文字として扱いたい場合は、char に変換します。

C#
int value = Console.Read();

if (value != -1)
{
char ch = (char)value;
Console.WriteLine(ch);
}

char 型だけでは -1 のような終端を表す値を扱いにくいため、int が使われています。

10-2. Console.Readで文字列は読み込めるのか

Console.Read() は文字列を読み込むメソッドではありません。1文字だけを読み込み、その文字コードを int として返します。

文字列を読み込みたい場合は、Console.ReadLine() を使います。

C#
string? text = Console.ReadLine();

たとえば、名前を入力してもらう場合は次のように書きます。

C#
Console.Write("名前を入力してください: ");
string? name = Console.ReadLine();

Console.WriteLine($"こんにちは、{name}さん");

Console.Read() は、1文字ずつ処理したい場合に使います。

C#
int value = Console.Read();
char ch = (char)value;

文字列入力には ReadLine()、1文字入力には Read() と覚えましょう。

10-3. Console.ReadLineで数値を読み込むにはどうするのか

Console.ReadLine() は文字列を返すため、数値として使うには変換が必要です。

単純に変換するなら int.Parse を使います。

C#
string? input = Console.ReadLine();
int number = int.Parse(input);

ただし、入力が数値でない場合は例外が発生します。

安全に数値入力を扱うなら、int.TryParse を使いましょう。

C#
Console.Write("数値を入力してください: ");
string? input = Console.ReadLine();

if (int.TryParse(input, out int number))
{
Console.WriteLine($"入力された数値: {number}");
}
else
{
Console.WriteLine("数値として認識できません。");
}

小数を扱いたい場合は double.TryParse を使います。

C#
string? input = Console.ReadLine();

if (double.TryParse(input, out double number))
{
Console.WriteLine(number);
}

ユーザー入力では、予期しない値が入力されることがあるため、TryParse を使うのがおすすめです。

10-4. Console.ReadとReadLineはどちらを使えばよいのか

基本的には、Console.ReadLine() を使えばよい場面が多いです。

名前、文章、数値などを入力してもらう場合は、Console.ReadLine() が適しています。

C#
string? input = Console.ReadLine();

数値として使いたい場合は、受け取った文字列を変換します。

C#
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}

一方、Console.Read() は1文字だけを読み取りたい場合に使います。

C#
int value = Console.Read();
char ch = (char)value;

ただし、Console.Read() は戻り値が int で、入力バッファの扱いも少しわかりにくいため、初心者には Console.ReadLine() のほうが扱いやすいです。

通常のコンソール入力では ReadLine()、1文字単位の処理では Read() と使い分けましょう。

10-5. ReadLineがnullを返すのはどんなときか

Console.ReadLine()StreamReader.ReadLine() は、読み込む行がない場合に null を返すことがあります。

特に StreamReader.ReadLine() では、ファイルの最後まで読み込んだあとに null が返ります。

C#
using StreamReader reader = new StreamReader("sample.txt");

string? line;

while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}

この書き方では、ReadLine()null になるまで1行ずつ処理します。

Console.ReadLine() でも、入力ストリームが閉じられた場合などに null が返る可能性があります。そのため、最近のC#では戻り値の型を string? として扱うことがあります。

C#
string? input = Console.ReadLine();

if (input == null)
{
Console.WriteLine("入力がありません。");
}
else
{
Console.WriteLine(input);
}

通常のキーボード入力ではあまり意識しないかもしれませんが、ReadLine() は常に文字列を返すとは限らない点を覚えておきましょう。

10-6. ファイル読み込みではFileとStreamReaderのどちらがよいのか

ファイル読み込みでは、ファイルサイズや処理内容によって FileStreamReader を使い分けます。

小さなファイルを簡単に読み込みたい場合は、File.ReadAllText() が便利です。

C#
string text = File.ReadAllText("sample.txt");

行ごとに配列として読みたい場合は、File.ReadAllLines() を使います。

C#
string[] lines = File.ReadAllLines("sample.txt");

一方、大きなファイルを効率よく処理したい場合は、StreamReader.ReadLine() が向いています。

C#
using StreamReader reader = new StreamReader("large.log");

string? line;

while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}

File.ReadAllText() は書き方が簡単ですが、ファイル全体をメモリに読み込みます。

StreamReader.ReadLine() は少しコードが長くなりますが、1行ずつ処理できるため、大きなファイルでも扱いやすいです。

目安としては、短いファイルなら File.ReadAllText()、大きいファイルやログ処理なら StreamReader.ReadLine() を選ぶとよいでしょう。

まとめ

C#の Read は、「読み込む」処理を表すメソッド名としてさまざまな場面で使われます。ただし、同じ Read という名前でも、読み込む対象や単位は異なります。

コンソール入力で1文字を読みたい場合は、Console.Read() を使います。戻り値は int 型で、読み込んだ文字の文字コードが返されます。文字として扱う場合は char に変換します。

C#
int value = Console.Read();
char ch = (char)value;

コンソールから1行分の文字列を読みたい場合は、Console.ReadLine() を使います。名前や文章、数値入力など、初心者が使う入力処理の多くは ReadLine() で対応できます。

C#
string? input = Console.ReadLine();

数値として使いたい場合は、int.Parseint.TryParse で変換します。

C#
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}

キー入力を待ちたい場合は、Console.ReadKey() を使います。

C#
Console.ReadKey();

ファイルを読み込む場合は、目的に応じて File.ReadAllText()File.ReadAllLines()StreamReader.ReadLine() などを使い分けます。

小さなファイルをまとめて読むなら File.ReadAllText()

C#
string text = File.ReadAllText("sample.txt");

ファイルを1行ずつ処理するなら StreamReader.ReadLine()

C#
using StreamReader reader = new StreamReader("sample.txt");

string? line;

while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}

C#のRead系メソッドで迷ったときは、「どこから読むのか」「何文字または何行読むのか」「戻り値の型は何か」を確認しましょう。

初心者は、まず Console.ReadLine()File.ReadAllText()StreamReader.ReadLine() の3つを押さえると、コンソール入力とファイル読み込みの基本をスムーズに理解できます。