C#ライブラリリファレンス - コンソール で一文字ずつ読み取る
コンソールの入力方式には、クックドモードとローモードが存在します。厳密な意味でのローモードはWin32APIを使用する必要がありますが、1文字ずつ読み取る程度の処理ならばC#でも、Console静的クラスにより簡単に実装できます。
日常でたとえると
厳しく文章を校正する。
使用に適した状況
ローモードほど自由度はなくてもいいから、1文字単位で処理を行いたい場合。本格的なローモードで、特別なアプリケーションを作るとき以外は、この機能で十分な機能を持つアプリケーションを作れます。
サンプル
/*----------------------------------------------------
*
* 1文字ずつ読み取る。
*
----------------------------------------------------*/
using System;
using System.Text;
class Sample
{
static void Main( )
{
//@キーが押されるまで文字を入力。
Console.WriteLine(
"何か文字列を入力して下さい。" +
Environment.NewLine +
"終了するときは半角の@を押して下さい。" );
char input = ' ';
var output = new StringBuilder();
do {
//※Enterキーを必要としない
var info = Console.ReadKey();
input = info.KeyChar;
output.Append( input );
Console.Write( input );
}
while ( input != '@' );
//終了の合図を消す。
output.Remove(
output.Length - 1,
1 );
//入力された文字列を表示。
Console.WriteLine();
Console.WriteLine(
"貴方が入力した文字列は「{0}」ですね。",
output.ToString() );
//終了。
Console.WriteLine( "終了です。Enterキーを押して下さい。" );
Console.ReadLine();
}
}
名前空間
Console静的クラスは、System名前空間に属します。
解説
以前ローモードの一例として、文字を1文字ずつ読み取り、細かく制御する方法があることを解説しました。非常に細かい単位で制御したい場合、以前解説したようにWin32APIの助けが必要ですが、多くの場面でそこまで細かく制御する必要はありません。
ちょっとわかりにくいですが、ReadメソッドはEnterキーが必要ですが、ReadKeyメソッドを使用すると、まるでWin32APIで実現するローモードのように、1文字単位で処理ができるようになります。
1文字単位でキーを読み取れると、高機能なコンソールアプリケーションを作成することが可能になると思います。現在はGUIやWebが当たり前になっていますが、過度な装飾がないコンソールの方が役に立つ場面もあります。それに加え、MVCパターンで実装し、コンソール(CUI)とGUIを2つ用意する手もあります。この方法はテストでも役立つでしょう。
裏話
以前の記事で、ローモードとしてこの機能を解説しようか迷いましたが、厳密な意味でローモードとは呼べないので、別に解説することにしました。それで、違う記事でC#はモードの違いを意識することなくプログラミングができると表現しました。