連載

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

Chapter 03 ステートメントの変化

株式会社ピーデー 川俣 晶
2004/03/17


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

 ステートメントを用いたテキスト・ファイルの入出力

 テキスト・ファイルの入出力には複数の方法があり、それぞれ微妙に使い勝手が違っている。ここでは、筆者が最初に本格的に使い込んだ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ではメソッド呼び出し時に括弧を付ける必要がある(参照を使ってファイルシステム・オブジェクトを利用する方法は、参照を使ったファイルシステム・オブジェクトの利用を参照)。


 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Chapter 03 ステートメントの変化
    1.WendをEnd Whileに書き換える/プロシージャ脱出とReturnステートメント/関数の戻り値とReturnステートメント
    2.読み取り専用変数/複合代入ステートメント/ Staticの付いたプロシージャ/ランダム・ファイルとVBFixedString属性
  3.ステートメントを用いたテキスト・ファイルの入出力/ファイルシステム・オブジェクトを用いたテキスト・ファイルの入出力
    4.参照を使ったファイルシステム・オブジェクトの利用/ .NET Frameworkクラス・ライブラリを用いたテキスト・ファイルの入出力
    5.エンコーディング名を指定したテキスト・ファイルの入出力/シフトJISとUTF-8の相違
    6.UTF-8によるファイル出力時の文字列サイズの変化/テキスト・ファイルの書き込み位置/さまざまなファイル入出力手段の中でどれを選ぶべきか
    7.Debug.Assertメソッドの移行
    8.TraceクラスとDebugクラスの相違/条件式抜きで必ず停止させるFailメソッド/マルチスレッドを同期するSyncLockステートメント/古い制御構造 On…GoToとOn…GoSub
 
「改訂版 プロフェッショナル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