[C#]StreamReaderのRead()がcharではなくintを返す理由

ファイルなどのストリームからデータを1文字読み込むためのメソッドとしてRead()というものが有ります。このメソッドは”1文字”読み込むのだから戻り値はcharでよいはずなのですが、なぜかint型になっています。

なぜintを返すような仕様となっているのでしょうか?


それは、Read()メソッドの戻り値は、ファイルから取得した文字に加えて、ファイルの終端(EOF)を返してくるからです。EOFというのは、読み込んでいるファイルがファイルの最後に達してしまい、それ以上読むべきデータが無い状況です。
(ちなみに、EOFに達している状態でさらにRead()をコールしても-1が返され続けます)

C#のcharは2byteなので、65536種類の文字が表現できます。
一方、Readの戻り値として返されるデータは、65536種類の文字+EOFの65537種類です。

なので、char型だと65537パターンのデータを表現できず、より表現範囲が多いint型が使われているという仕組みです。Read()はEOF以外の場合は正の値、EOFの場合は-1を返すという仕様になっています。

Read()メソッドで読み込んだデータは、後続の処理ではchar型の変数に入っていると何かと便利な場合が多いですが、上記の理由により、EOFチェックを行った後ならキャストしてしまってOKです。

StreamReader reader = ...;
 
int data = reader.Read();
if ( data == -1 ) {
	//EOFが来た時の処理
}
 
// ここでchar型にキャストする
char ch = (char)data;


関連記事

コメントを残す

メールアドレスが公開されることはありません。