スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C#ライブラリリファレンス - ローモードのコンソール

概要
 コンソールの入出力モードは大別すると、クックド(cooked)とロー(raw)の2つがあります。C#でローモードを行うにはConsole静的クラスを使用するだけではなく、Win32APIの力を借ります。

日常でたとえると
 今から先生が黒板に書くから板書して。

使用に適した状況
 簡単なアプリケーションを作りたい場合に使用します。GUIが一般的ですが、ちょっとしたアプリケーションならば、コンソールを使用したほうがCUIアプリケーションの方が使い勝手がいいです。
 しかし、CUIだからといって簡単なアプリケーションだけしか作れないわけではありません。ローモードを使用すれば、もっと複雑なアプリケーションを作ることも可能となります。
 クックドモードとは違い、ローモードでデバッグ目的に使用する事はあまりないと思います。

サンプル

/*----------------------------------------------------
 * 
 *  ロー( raw )モードのコンソール
 *  
 ----------------------------------------------------*/
using System;
using System.Text;
using System.Runtime.InteropServices;

class Sample
{
    //標準入力。
    const int STD_INPUT_HANDLE = -10;

    //1文字ごとに出力する。
    const int ENABLE_ECHO_INPUT = 0x0004;

    //ハンドルを取得する。
    [DllImport( "kernel32.dll" )]
    static extern IntPtr GetStdHandle( int inputHandle );

    //現在のコンソールモードを取得する。
    [DllImport( "kernel32.dll" )]
    static extern bool GetConsoleMode(
        IntPtr consoleHandle,
        ref int mode );

    //コンソールモードを設定する。
    [DllImport( "kernel32.dll" )]
    static extern bool SetConsoleMode(
        IntPtr consoleHandle,
        int mode );

    static void Main( )
    {
        //Enterキーが必要にならないように設定する。
        IntPtr consoleHandle = GetStdHandle( STD_INPUT_HANDLE );
        int oldMode = 0;
        GetConsoleMode( consoleHandle, ref oldMode );
        int newMode = ENABLE_ECHO_INPUT;
        SetConsoleMode( consoleHandle, newMode );
        InputOutPut();
        SetConsoleMode( consoleHandle, oldMode );

        //終了。
        Console.WriteLine( "終了です。Enterキーを押して下さい。" );
        Console.ReadLine();
    }

    //Enterキーが必要なのでそのままではローモードにならない。
    private static void InputOutPut( )
    {
        //@キーが押されるまで文字を入力。
        Console.WriteLine(
            "何か文字列を入力して下さい。" +
            Environment.NewLine +
            "終了するときは半角の@を押して下さい。" );
        char input = ' ';
        var output = new StringBuilder();
        do {
            input = Convert.ToChar( Console.Read() );
            output.Append( input );
            Console.Write( input );
        }
        while ( input != '@' );

        //終了の合図を消す。
        output.Remove(
            output.Length - 1,
            1 );

        //入力された文字列を表示。
        Console.WriteLine();
        Console.WriteLine(
            "貴方が入力した文字列は「{0}」ですね。",
            output.ToString() );
    }
}


名前空間
 Console静的クラスが所属している名前空間はSystemです。ローモードの場合、Win32APIの力を借りるためにSystem.Runtime.InteropServices名前空間に属する、DllImport属性も必要となります。

解説
 Unixシステムでは文字入力の2つの方式を、クックド(cooked)ロー(row)と呼んでいました。Windowsでもその習慣を引き継ぎ、コンソールはこの2つの方式に対応しています。Win32APIで細かく指定することができますが、C#(.NET)では2つのモードを意識することがなく使用することができます。しかしながら、その事はプログラマーが覚えておくべきことなので解説します。
 今回解説しているローモードは、1文字ごとに細かく制御します。ロー(raw)とは、生を意味する言葉で、調理せずに生で文字を扱う事を表しています。ローモードではプログラマーがすべてを管理します。今回は紹介していませんが、マウスイベントも補足できるようになります。
 ローモードを使用するうえで重要なAPIは、SetConsoleModeGetConsoleModeGetStdHandleの3つです。これら3つのWin32APIは、.NETで対応していないのでインポートします。もし、他にも細かく制御したいことがあるのであれば、Win32APIのお世話になるでしょう。.NETのライブラリは優れていますが、たまにそういう事もあるので、Win32APIの使用経験が必要となります。
 .NETでは普段は気にすることなく、ConsoleオブジェクトのReadLineもしくはWriteLineを使って、文字列を気軽に読み書きします。ですが、プログラマーが意識して使用するローモードは使用できません。ローモードの性質から言って、それは当然のことだといえるでしょう。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。