連載

プロフェッショナルVB.NETプログラミング
―― VB 6プログラマーのためのVB.NET入門 ――

第7回 ファイル入出力(前編)

(株)ピーデー
川俣 晶
2002/05/30

Page1 Page2 Page3

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

 テキスト・ファイルの入出力には複数の方法があり、それぞれ微妙に使い勝手が違っている。今回は主な方法を取り上げて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関数で読み込むべきものである。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第7回 ファイル入出力(前編)
  1.ステートメントを用いたテキスト・ファイルの入出力
    2.ファイル・システム・オブジェクトを用いたテキスト・ファイルの入出力
    3.VB専用ファイル入出力関数とファイル・システム・オブジェクト
 
「プロフェッショナル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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間