|
|
連載
プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――
第7回 ファイル入出力(前編)
(株)ピーデー
川俣 晶
2002/05/30
|
ステートメントを用いたテキスト・ファイルの入出力
テキスト・ファイルの入出力には複数の方法があり、それぞれ微妙に使い勝手が違っている。今回は主な方法を取り上げてVB 6(Visual Basic 6.0)とVB.NET(Visual Basic .NET)の相違を解説したい。まず、筆者が最初に本格的に使い込んだ8bitパソコン時代から続く由緒正しいOpenステートメントを用いた例を見てみよう。
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
|
|
Openステートメントを用いたVB 6のサンプル・プログラム1 |
これを実行すると以下のようになる。
1: Test Data
2: テストデータ
3: ファイル番号は 1
4: A B C
5: True False
6: #TRUE#,#FALSE#
7: 2002/04/25
8: #2002-04-25#
|
|
サンプル・プログラム1の実行結果 |
これを、なるべく同じようなコードになるようVB.NETに書き換えたものが以下のソースである。
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
|
|
サンプル・プログラム1をVB.NETで書き換えたサンプル・プログラム2 |
これを実行すると以下のようになる。
1: Test Data
2: テストデータ
3: ファイル番号は 1
4: A B C
5: True False
6: #TRUE#,#FALSE#
7: 2002/04/25
8: #2002-04-25#
|
|
サンプル・プログラム2の実行結果 |
このソースでは、何もかもが劇的に変わっているかのように見えるが、機能的にはほとんど1対1に対応しており、機械的な書き換えだけで容易に移行することができる。例えば、オープンするファイルにはファイル番号を割り当てて使うというようなマナーは共通している。OpenステートメントがFileOpen関数に、CloseステートメントがFileCloseステートメントに変わるのはランダム・ファイルで解説したとおりである。
そして、Printステートメントは、Print関数とPrintLine関数に変わる。2つあるのは、出力後に改行する場合と改行しない場合で、異なる名前を持っているためである。VB 6のPrintステートメントでは、単に最後にセミコロン(;)を付ける、付けないで区別していた機能が、名前の異なる別の関数に対応しているのである。そのため、最後にセミコロンの付くPrintステートメントは、Print関数に書き換え、そうではないPrintステートメントはPrintLine関数に書き換える。Writeステートメントも、同様に、Write関数とWriteLine関数に書き換える。
Print/PrintLine関数の引数はすべてカンマで区切って指定する。セミコロンによる区切りはサポートされない。カンマで区切って、式またはSPC()またはTAB()を列挙して記述する。SPC()とTAB()の果たす役割は、VB 6と同じであるが、前後がセミコロンではなくカンマであっても、カンマはタブ位置に揃える機能を持たない。SPC()もTAB()も入れずにカンマで区切って式を続けると、出力位置をタブ位置に揃える機能が働く。例えばソース9行目では、「"ファイル番号は", fileno」と直接2つの式が並んでいるが、このときはタブ位置まで出力位置を進める機能が働いている。しかし、10行目のようにSPC()やTAB()を間に挟んで記述されている場合は、その機能が働いていない。
さて、サンプル・ソースの後半は、ファイルからテキスト・データを読み出しているが、“Line Input”ステートメントの使い方が著しく変わっていることが分かるだろう。VB 6の“Line Input”ステートメントは、値を受け取る変数名を引数に記述するが、VB.NETのLineInput関数は読み込んだ1行を値として持ち、変数名を引数に指定しない。
このサンプル・ソースでは、説明の便宜上、すべてのデータをLineInput関数で受けているが、もちろん、これは好ましいことではない。Write/WriteLine関数で書いたデータは、LineInput関数ではなく、Input関数で読み込むべきものである。
Insider.NET 記事ランキング
本日
月間