|
|
連載
改訂版
プロフェッショナルVB.NETプログラミング
Chapter 03 ステートメントの変化
株式会社ピーデー
川俣 晶
2004/03/17 |
|
|
テキスト・ファイルの入出力には複数の方法があり、それぞれ微妙に使い勝手が違っている。ここでは、筆者が最初に本格的に使い込んだ8ビットパソコン時代から続く、由緒正しいOpenステートメントを用いた例を見てみよう(リスト3-29)。
1: Private Sub Form_Load()
2: Dim fileno As Integer
3: fileno = FreeFile
4:
5: Open "c:\test.txt" For Output As #fileno
6: Print #fileno, "Test";
7: Print #fileno, " Data"
8: Print #fileno, "テストデータ"
9: Print #fileno, "ファイル番号は"; fileno
10: Print #fileno, "A"; Spc(1); "B"; Tab(8); "C"
11: Print #fileno, True, False
12: Write #fileno, True, False
13: Print #fileno, Date
14: Write #fileno, Date
15: Close #fileno
16:
17: Dim s As String
18: Open "c:\test.txt" For Input As #fileno
19: While Not EOF(fileno)
20: Line Input #fileno, s
21: Debug.Print s
22: Wend
23: Close #fileno
24: End Sub
|
|
リスト3-29 Openステートメントを用いたプログラム
|
これを実行すると以下のようになる。
1: Test Data
2: テストデータ
3: ファイル番号は 1
4: A B C
5: True False
6: #TRUE#,#FALSE#
7: 2002/04/25
8: #2002-04-25#
|
|
リスト3-30 リスト3-29の実行結果
|
これを、なるべく同じようなコードになるよう、VB.NETに書き換えたものがリスト3-31である。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim fileno As Integer
3: fileno = FreeFile()
4:
5: FileOpen(fileno, "c:\test.txt", OpenMode.Output)
6: Print(fileno, "Test")
7: PrintLine(fileno, " Data")
8: PrintLine(fileno, "テストデータ")
9: PrintLine(fileno, "ファイル番号は", fileno)
10: PrintLine(fileno, "A", SPC(1), "B", TAB(8), "C")
11: PrintLine(fileno, True, False)
12: WriteLine(fileno, True, False)
13: PrintLine(fileno, Today)
14: WriteLine(fileno, Today)
15: FileClose(fileno)
16:
17: Dim s As String
18: FileOpen(fileno, "c:\test.txt", OpenMode.Input)
19: While Not EOF(fileno)
20: s = LineInput(fileno)
21: Trace.WriteLine(s)
22: End While
23: FileClose(fileno)
24: End Sub
|
|
リスト3-31 リスト3-29をVB.NETで書き換えたプログラム
|
これを実行すると以下のようになる。
1: Test Data
2: テストデータ
3: ファイル番号は 1
4: A B C
5: True False
6: #TRUE#,#FALSE#
7: 2002/04/25
8: #2002-04-25#
|
|
リスト3-32 リスト3-31の実行結果
|
このソースでは、何もかもが劇的に変わっているかのように見えるが、機能的にはほとんど1対1に対応しており、機械的な書き換えだけで容易に移行することができる。例えば、オープンするファイルにはファイル番号を割り当てて使うというような基本は共通している。OpenステートメントがFileOpen関数に、CloseステートメントがFileCloseステートメントに変わるのは、ランダム・ファイルとVBFixedString属性で解説しているとおりである。
そして、Printステートメントは、Print関数とPrintLine関数に変わる。2つあるのは、出力後に改行する場合と改行しない場合で、異なる名前を持っているためである。VB 6のPrintステートメントでは、単に最後にセミコロン(;)を付ける/付けないで区別していた機能が、名前の異なる別の関数に対応しているのである。そのため、最後にセミコロンの付くPrintステートメントはPrint関数に書き換え、そうではないPrintステートメントはPrintLine関数に書き換える。Writeステートメントも、同様に、Write関数とWriteLine関数に書き換える。
Print/PrintLine関数の引数は、すべてカンマで区切って指定する。セミコロンによる区切りはサポートされない。カンマで区切って、式またはSPC()、TAB()を列挙して記述する。SPC()とTAB()の果たす役割はVB 6と同じであるが、前後がセミコロンではなくカンマであっても、カンマはタブ位置に揃える機能を持たない。SPC()もTAB()も入れずにカンマで区切って式を続けると、出力位置をタブ位置に揃える機能が働く。例えば、リスト3-31の9行目では「"ファイル番号は", fileno」と直接2つの式が並んでいるが、このときはタブ位置まで出力位置を進める機能が働いている。しかし、10行目のようにSPC()やTAB()を間に挟んで記述されている場合は、その機能が働いていない。
サンプル・ソースの後半は、ファイルからテキスト・データを読み出しているが、Line Inputステートメントの使い方が著しく変わっていることが分かるだろう。VB 6のLine Inputステートメントは、値を受け取る変数名を引数に記述するが、VB.NETのLineInput関数は読み込んだ1行を値として持ち、変数名を引数に指定しない。
このサンプル・ソースでは、説明の便宜上、すべてのデータをLineInput関数で受けているが、もちろん、これは好ましいことではない。Write/WriteLine関数で書いたデータは、LineInput関数ではなく、Input関数で読み込むべきものである。
WSH(Windows Scriptiong Host)などでVBS(Visual Basic Script)プログラミングしている場合、伝統的なファイル入出力ステートメントは使用できず、その代わり、ファイルシステム・オブジェクトが提供される。これはフルセットのVB 6でも利用できるもので、より新しい世代のファイルアクセス手段といえる。ステートメントを用いたテキスト・ファイルの入出力のサンプル・ソースとほぼ同じ内容を、ファイルシステム・オブジェクトを用いて書き換えてみたのがリスト3-33である。
1: Private Sub Form_Load()
2: Dim fs As Object, wfile As Object, rfile As Object
3: Set fs = CreateObject("Scripting.FileSystemObject")
4: Set wfile = fs.CreateTextFile("c:\test.txt", True)
5: wfile.Write "Test"
6: wfile.WriteLine " Data"
7: wfile.WriteLine "テストデータ"
8: wfile.Write "ファイル番号は"
9: wfile.WriteLine "使用していません"
10: wfile.WriteLine "A" & Space(1) & "B" & Space(5) & "C"
11: wfile.WriteLine True & "," & False
12: wfile.WriteLine Date
13: wfile.Close
14:
15: Const ForReading = 1
16: Set rfile = fs.OpenTextFile("c:\test.txt", ForReading)
17: Dim s As String
18: While Not rfile.AtEndOfStream
19: s = rfile.ReadLine
20: Debug.Print s
21: Wend
22: rfile.Close
23: End Sub
|
|
リスト3-33 ファイルシステム・オブジェクトを用いてリスト3-29を書き換えたプログラム
|
これを実行すると次のようになる。
1: Test Data
2: テストデータ
3: ファイル番号は使用していません
4: A B C
5: True,False
6: 2002/04/25
|
|
リスト3-34 リスト3-33の実行結果
|
ファイルシステム・オブジェクトには、Writeステートメントに相当するものはない。また、書式を整える機能も持っておらず、出力前に文字列として書式を整えておかねばならない。当然、10行目に見られる2番目のSpace()は、TAB()と等価ではない。
次に、このソースをVB.NETで動くようにしてみよう(リスト3-35)。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim fs As Object, wfile As Object, rfile As Object
3: fs = CreateObject("Scripting.FileSystemObject")
4: wfile = fs.CreateTextFile("c:\test.txt", True)
5: wfile.Write("Test")
6: wfile.WriteLine(" Data")
7: wfile.WriteLine("テストデータ")
8: wfile.Write("ファイル番号は")
9: wfile.WriteLine("使用していません")
10: wfile.WriteLine("A" & Space(1) & "B" & Space(5) & "C")
11: wfile.WriteLine(True & "," & False)
12: wfile.WriteLine(Today)
13: wfile.Close()
14:
15: Const ForReading = 1
16: rfile = fs.OpenTextFile("c:\test.txt", ForReading)
17: Dim s As String
18: While Not rfile.AtEndOfStream
19: s = rfile.ReadLine
20: Trace.WriteLine(s)
21: End While
22: rfile.Close()
23: End Sub
|
|
リスト3-35 リスト3-33をVB.NETで書き換えたプログラム
|
これを実行すると以下のようになる。
1: Test Data
2: テストデータ
3: ファイル番号は使用していません
4: A B C
5: True,False
6: 2002/04/25
|
|
リスト3-36 リスト3-35の実行結果
|
見てのとおり、基本的にはほとんど変更なく利用できることが分かると思う。これは、ファイルシステム・オブジェクトがVBという言語の外側に存在するオブジェクトであるため、VBのバージョンの違いによる影響を受けにくいためである。
しかし、微妙な相違があることに注意が必要だ。まず、ソース3行目などのオブジェクトの参照への代入で、setキーワードが不要になったことを確認していただきたい。VB.NETではオブジェクトの参照を代入する場合、setキーワードは不要になった。また、Closeメソッドの後ろに括弧が必要になっている。VB.NETではメソッド呼び出し時に括弧を付ける必要がある(参照を使ってファイルシステム・オブジェクトを利用する方法は、参照を使ったファイルシステム・オブジェクトの利用を参照)。
業務アプリInsider 記事ランキング
本日
月間