連載

改訂版
プロフェッショナルVB.NETプログラミング

Chapter 15 コンソール・アプリケーション

株式会社ピーデー 川俣 晶
2004/09/23


 本記事は、(株)技術評論社が発行する書籍『VB6プログラマーのための入門 Visual Basic .NET 独習講座』の一部分を許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。
コンソール・アプリケーションと入出力

 コマンドライン引数で解説したコマンドライン引数は、ファイル名などを指定するのには便利だが、処理させたい大量のデータを記述する用途には向かない。また、結果を表示するための出力も重要である。もちろん、ファイルを読み書きすれば対処できるが、そのほかに、コンソール・アプリケーションには「標準入出力」という便利な機能が用意されている。

 このうち、標準出力へ出力する手段は、すでにSystem.ConsoleクラスのWriteLineメソッドとして紹介している。WriteLineメソッドのほかに、出力後に改行しないWriteメソッドも存在する。

 標準入力は、1文字を入力するReadメソッドと、1行を入力するReadLineメソッドが存在する。

 これらを使用したサンプル・プログラム「Sample004n」を次に示す(リスト15-29)。これは、2つの数値を入力して、その四則演算の結果を出力する。

 1: Module Module1
 2:
 3:   Sub Main()
 4:     Dim s1, s2 As String
 5:     Dim i1, i2 As Single
 6:
 7:     s1 = Console.ReadLine()
 8:     i1 = Single.Parse(s1)
 9:
10:     s2 = Console.ReadLine()
11:     i2 = Single.Parse(s2)
12:
13:     Console.WriteLine(i1 + i2)
14:     Console.WriteLine(i1 - i2)
15:     Console.WriteLine(i1 * i2)
16:     Console.WriteLine(i1 / i2)
17:   End Sub
18:
19: End Module
リスト15-29 2つの数値が入力されると四則演算の結果を出力するプログラム「Sample004n」

 このソースでは、まず7行目で1行を入力し、8行目で実数に変換する。そして次に、10行目でさらに1行を入力し、11行目で実数に変換する。最後の13〜16行目で、一気に四則演算を行って結果を出力する。

 以下はこれを実行した一例である。

●図15-30 「Sample004n」の実行結果例(「23」と入力した場合)

 実行ファイル名はSample004n.exeとして作成したので「Sample004n」と入力してプログラムを起動する。そして「23」と入力していく。すると「5、-1、6、0.6666667」という結果を表示して終了する。

 このプログラムでは、10行目のReadLineメソッドを実行したら、もはや7行目のReadLineメソッドに戻る手段が存在しないことに注意が必要である。一度、7行目のReadLineメソッドに対応する入力でEnterキーを押してしまったら、もはや入力したデータを訂正する手段はない。ダイアログ・ボックスで、テキスト・ボックスを2つ並べて入力を促すような使い方は、標準入力では実現しにくい。しかし、それだけのデメリットを甘受しても、標準入力には大きなメリットがある。次に、そのメリットについて説明する。

リダイレクトを活用する

 標準入力と標準出力では「リダイレクト」という機能が使用できる。これは、コマンドラインの指定により、標準入力や標準出力をキーボードやコンソール・ウィンドウではなく、ファイルやデバイスに切り替える機能である。この機能を使えば、例えば、前項のサンプル・プログラムの入力を、キーボードではなくファイルから入力させることが簡単にできる。

 標準入力を切り替えるには、コマンドライン引数のどこかに「<」記号を入力し、それに続いてファイル名を入力する。指定するファイルは、通常のテキスト・ファイルである必要がある。一般的な日本のパソコンなら、シフトJISのテキスト・ファイルになる。例えば、前項のプログラムに、c:\test.txtファイルの内容を入力させるには、

Sample004n < c:\test.txt

と入力する。実際に実行してみた例が、以下の図15-31である。

●図15-31 リダイレクトによりファイルの内容を入力とした例
  typeコマンドによりファイルの内容を表示
  ファイルの内容を入力としてサンプル・プログラム「Sample004n」を実行

 最初に実行しているtypeコマンドは、テキスト・ファイルの内容を表示するコマンドである。引数のファイル名のファイル内容を表示する。typeコマンドの実行結果を見てのとおり、内容は2行で、1行目には3、2行目には4が記述されている。このファイルを入力に指定すると、キーボードから「34」と入力したのと同じ効果が得られる。

 入力データをファイルで用意しておけば、同じような処理を何度も実行する際に、データを繰り返し打ち込む必要がなく、便利である。この機能があれば、必ず大量の指定を入力しないと動作しないGUIアプリケーションよりも、コンソール・アプリケーションの方が便利に利用できる場合もあるだろう。

 さて、入力の次は標準出力のリダイレクトを試してみよう。出力を切り替える場合は、入力で「<」記号を用いた代わりに「>」記号を使用するだけで、あとは入力と同様である。実際に使ってみた例は、以下のとおりである。

●図15-32 リダイレクトにより標準入力と標準出力を使用した例
  サンプル・プログラム「Sample004n」の実行結果をファイルに出力(コマンドの実行後に「45」と入力している)
  typeコマンドにより実行結果ファイルの内容を表示
  ファイルを入力としてサンプル・プログラムを実行し、別ファイルに実行結果を出力
  typeコマンドにより実行結果ファイルの内容を表示

 「Sample004n >c:\result.txt」と入力したあとは、「45」と入力している。次のtypeコマンドで、確かに結果がファイルに出力されていることが確認できる。また、後半は、標準入力と標準出力の両方を指定したケースを示している。膨大なデータを入力して出力するプログラムを実行する場合でも、このように使えば(処理時間の長さを除けば)データの膨大さを意識せずに操作することができる。

パイプの活用

 標準入力と標準出力は、ほかのプログラムにも接続できる。これを「パイプ」という。例えば、2個のコンソール・アプリケーションがあった場合に、片方のプログラムの標準出力の結果を、ファイルなどにいったん出力することなく、もう一方のプログラムの標準入力に入力させることができる。

 これを体験するために、簡単なサンプル・プログラムを用意した。これは、標準入力から入力した文字列を、すべて大文字に変換してから標準出力に出力するものである。

 1: Module Module1
 2:
 3:   Sub Main()
 4:     Do
 5:       Dim s As String
 6:       s = Console.ReadLine()
 7:       If s Is Nothing Then
 8:         Exit Do
 9:       End If
10:       Dim r As String
11:       r = s.ToUpper()
12:       Console.WriteLine(r)
13:     Loop
14:   End Sub
15:
16: End Module
リスト15-33 標準入力から入力された文字列を大文字に変換して標準出力に出力するサンプル・プログラム「Sample003n」

 内容について簡単に説明すると、7行目の判定は、入力が終わりに達したかどうかを調べている。ファイルでなくても、どんなデータにも終わりはあるので、必ず変数sはNothingになるときがくる。キーボードから入力している場合は、[Ctrl]+[z]して終わりを示す。それから、11行目のToUpperメソッドは、文字列を大文字化する機能を持ったSystem.Stringクラスのメソッドである。

 さて、これを使ってみよう。このサンプル・プログラムの実行ファイル名は、Sample003n.exeだとする。dirコマンドの出力を、パイプでこのサンプル・プログラムにつないで見よう。パイプは「|」記号で示す。「|」記号の手前に、標準出力をパイプに送る側のコンソール・アプリケーションを記述し、あとに標準入力をパイプから受け取る側のコンソール・アプリケーションを記述する。例えば、dirコマンドとSample003nコマンドをパイプでつなぐなら、

dir | Sample003n

と記述する。図15-34はdirコマンドを単独で使った場合と、Sample003nとパイプでつないだ場合の実行結果である。

●図15-34 パイプを使用してサンプル・プログラム「Sample003n」を実行した結果
  dirコマンドを実行して、ファイルの一覧を出力
  パイプによりdirコマンドの出力をサンプル・プログラム「Sample003n.exe」の入力として実行(ファイルの一覧がすべて大文字で出力されているのが分かる)

 パイプでSample003nを通すと、文字列の中の小文字がすべて大文字に変わっていることが分かる。

 パイプは何段階でも連続して使用できる。図15-35はさらにもう1段、findコマンドを接続した例である。findコマンドは、標準入力から入力されたテキスト中で、指定文字列が含まれている行だけを標準出力に出力する機能を持っている。

●図15-35 2段階にパイプを使用した例

 ここでは、dirコマンドの出力を入力として実行したサンプル・プログラム「Sample003n.exe」の結果を、さらにfindコマンドに入力し、“EXE”という文字列を含む行のみを画面に出力している。

 これは、dirコマンドで「*.exe」というワイルドカードを指定した場合と同じではないことに注意が必要だ。「dir *.exe|Sample003n」というコマンドを打った場合は以下のようになり、結果が異なる。

●図15-36 *.exeを指定したdirコマンドの出力を入力として、サンプル・プログラム「Sample003n」を実行した場合
 

 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Chapter 15 コンソール・アプリケーション
    1.コンソール・アプリケーションとは何か?(1)
    2.コンソール・アプリケーションとは何か?(2)
    3.VB.NETで作成するコンソール・アプリケーション/コマンドライン引数
  4.コンソール・アプリケーションと入出力/リダイレクトを活用する/パイプの活用
    5.バッチの活用/スケジュールして無人実行/プロセスの終了コード
 
「改訂版 プロフェッショナルVB.NETプログラミング 」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH