これまで幾度となくLine Input #に相当する物を求める要望や実際に作られた物を拝見してきましたが、ようやくLine Input #に代わる、1行読み込みの手段をAB5に用意しました。こんな感じです。

#console

Imports ActiveBasic
Imports ActiveBasic.Strings
Imports System
Imports System.IO

Try
	Print "Input filename: ";
	Dim filename = Console.ReadLine
	Dim sr = New StreamReader(filename)
	Dim i = 1 As Long
	Do
		Dim s = sr.ReadLine
		If IsNothing(s) Then
			Exit Do
		End If
		s = s.Replace(Ex"\\t", "    ")
		Print SPrintf("%3d: %s", New Int32(i), s)
		i++
	Loop
Catch e As Exception
	Print "エラー:"; e.ToString(), Hex$(e.HResult)
End Try

Console.ReadLine()
ExitProcess(0)

ユーザから指定されたファイルを先頭に行数を付け、タブを4文字の空白に展開して出力するプログラムです。

End命令ではなくExitProcess関数を使っている理由は、Endで終わらせると終了処理の最中にプログラムが落ちるためで、ExitProcessでごまかしています。ここらへんはAB5が未完成ゆえのことです。

簡単に解説しておくと、Console.ReadLineはコンソール画面から、StreamReaderインスタンスのReadLineはファイルから1行の文字列を読み込み、戻り値にします。ファイルの終わりに達すると、Nothingを返すので、IsNothing関数でファイルの終わりかどうかを判定できます。SPrintもおもしろいことになっていますがまた今度です。

出力はこんな感じです。ここでは、自身のソースファイルを指定してみました。

Input filename: h:\\u.ab
  1: #console
  2:
  3: Imports ActiveBasic
  4: Imports ActiveBasic.Strings
  5: Imports System
  6: Imports System.IO
  7:
  8: Try
  9:     Print "Input filename: ";
 10:     Dim filename = Console.ReadLine
 11:     Dim sr = New StreamReader(filename)
 12:     Dim i = 1 As Long
 13:     Do
 14:         Dim s = sr.ReadLine
 15:         If IsNothing(s) Then
 16:             Exit Do
 17:         End If
 18:         s = s.Replace(Ex"\\t", "    ")
 19:         Print SPrintf("%3d: %s", New Int32(i), s)
 20:         i++
 21:     Loop
 22: Catch e As Exception
 23:     Print "エラー:"; e.ToString(), Hex$(e.HResult)
 24: End Try
 25:
 26: Console.ReadLine()
 27: ExitProcess(0)

スポンサード リンク

この記事のカテゴリ

  • ⇒ AB5の解(ソリューション) —— Line Input # ——