連載:VB 6ユーザーのための
これならマスターできるVB 2005超入門

第8回 ファイル入出力をマスターしよう

羽山 博
2007/04/20
Page1 Page2 Page3 Page4

■テキスト・ファイルからデータを読み出せるようにするには

 [検索]ボタン、つまりbtnSearchコントロールのClickイベント・ハンドラの名前がcountNumberであるとすると、コードは以下のようになる。まずは、ファイルから行を読み出す部分に注目して見てみよう。対象となるファイルの名前は「c:\Home\attend.log」とする。

Imports System.IO
  :
  :
Private Sub countNumber(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click

  Dim sr As StreamReader
  Dim oneLine As String
  Dim iCount As Integer = 0

  sr = New StreamReader("c:\Home\attend.log")

  Do While Not sr.EndOfStream
    oneLine = sr.ReadLine()
    If oneLine.Contains(txtNumber.Text) = True Then
      iCount = iCount + 1
    End If
  Loop

  sr.Close()
  lblCount.Text = iCount

End Sub
リスト1 ファイルから1行ずつ読み出すためのコード
  StreamReaderクラスのオブジェクトを参照するための変数を宣言する。
  StreamReaderクラスの新しいオブジェクトを作成する。コンストラクタの引数にファイル名を指定すれば、そのファイルからデータを読み出すためのストリームが利用できるようになる。戻り値を で宣言したsrに代入し、srという変数でそのオブジェクトが利用できるようにする。
  EndOfStreamプロパティがTrueでない間(ストリームの末尾に達していない間)繰り返す。
  ReadLineメソッドを利用して1行読み込む。
  行数をカウントする。
  すべての処理が終わったら、ストリームを閉じておく。

 StreamReaderクラスを利用すれば、テキスト・ファイルなどを読み込むために使われる「ストリーム」が使えるようになる。ストリームというのは、先頭から末尾まで“ひとつながり”のデータと考えるといいだろう。ストリームを操作することにより、そのデータを読み出したり、(出力用のストリームであれば)データを出力したりすることができる。

 実感を持ってStreamReaderクラスの働きや、ストリームの働きを理解するには慣れが必要だが、上記リストの を図解すれば、オブジェクトの作成方法と、ストリームのイメージがつかめると思う(図3)。


図3 StreamReaderクラスのオブジェクトを利用する
図中の および はリスト1での番号に対応している。
  StreamReaderクラスのオブジェクトを参照するための変数srを宣言する。
  を一度に理解するのは難しいので、ここ( )から順序立てて見ていくとよい。
  「New StreamReader("c:\Home\attend.log")」とすれば、StreamReaderクラスのオブジェクトが作られ、c:\Home\attend.logファイルからデータを読み出すためのストリームが作られる。
  「sr = New StreamReader("c:\Home\attend.log")」とすれば、srという変数を使って、オブジェクトを利用できるようになる。

 クラスやオブジェクトについては、まだ詳しくは説明していないが、クラスとは「ひな型」のようなもので、オブジェクトは、その「ひな型」から作られた個々の「モノ」のようなものだ。これまで慣れ親しんだ変数と対比していえば、整数や実数と呼ばれるものがクラスで、個々のiCountといった変数がオブジェクトに当たる。

 New句の後に「クラス名()」を記述すれば、クラスの新しいオブジェクト(インスタンスとも呼ばれる)が作られる。このとき、()の中に引数を記述しておけば、あらかじめ何らかのデータを与え、必要な処理をしておくこともできる*1

 例えば、

New StreamReader("C:\Home\attend.log")

と書けば、引数で指定した「C:\Home\attend.log」というファイルからデータを読み出すためのストリームが利用できるようになる。

*1 クラスのコンストラクタと呼ばれるメソッドが自動的に呼び出される。コンストラクタはクラスの新しいオブジェクトが作られるときに実行されるメソッドで、初期化やそのほかの準備に使われる。

 なお、実際には、StreamReaderクラスのオブジェクトを作成するときには、そのコンストラクタの引数を必ず指定しなければならないので、

New StreamReader()

とだけ書いてもエラーとなることに注意(ステップを追って分かりやすく説明するために、引数を書かないときの一般的な働きをあえて示しただけである)。

 ところで、New句で新しいオブジェクトを作成しても、それだけではそのオブジェクトを利用することはできない。なぜなら、名前が付いていないからだ。もう一度、

New StreamReader("C:\Home\attend.log")

というコードを見てみよう。StreamReaderは変数名ではなく、あくまでもクラスの名前。StreamReaderクラスという「ひな型」に従ってオブジェクトを作ったわけだが、どういう名前で呼べばいいか分からない。子どもが生まれたのにまだ名前も決めず、出生届も出していないようなものだ。そこで、

sr = New StreamReader("C:\Home\attend.log")

と書く。こうすれば、srという変数(StreamReader型であると宣言している!)を使って、StreamReader型のオブジェクトが利用できるようになる。

■ストリームから1行ずつ読み出すには

 オブジェクトの作成の話が長くなったが、続いてストリームを利用してデータを読み出すコードを見ておこう。データを1行読み出すには、StreamReaderクラスのReadLineメソッドを使えばよい。

 実際にはsrという変数を使ってStreamReaderクラスのオブジェクトを操作するので、

sr.ReadLine()

のように書く。このReadLineメソッドは、改行を示すLF(16進数で0A)かCR+LF(16進数で0D0A)というコードが現れるまでを1行としてデータを読み込み、読み出した行を文字列として返してくれる(末尾のLFやCR+LFは返さない)。従って、

oneline = sr.ReadLine()

とすれば、読み出した行がonelineという文字列変数に代入されることになる。

 StreamReaderクラスのEndOfStreamプロパティは、ストリームの末尾に達していればTrueとなるので、Trueでない間、ReadLineメソッドで1行ずつ読み出し、必要な処理を繰り返せばよい。

 なお、ReadLineメソッドは、ストリームの末尾に達するとNothingを返すので、1行ずつデータを読み出すには次のような書き方もできる。

oneLine = sr.ReadLine()
Do Until oneLine = Nothing
  ' 必要な処理をここに書く
  oneLine = sr.ReadLine()
Loop

 C言語など、ほかの言語を知っている人なら、

Do Until oneLine = sr.ReadLine()
  ' 必要な処理をここに書く
Loop

と書きたくなるところだが、これだと実行時にエラーとなってしまう。Visual Basicでは、IfやUntilの後に書かれた“=”は代入演算子ではなく、比較演算子と見なされるからだ。

■文字列が含まれているかどうかを知るには

 繰り返し処理の中で実行している処理は簡単。読み出した行に、学生番号が含まれていれば、iCountの値を増やしているだけだ。このプログラムでは、次のように、検索文字列が含まれるかどうかを調べるContainsメソッドを使って、指定した学生番号が含まれるかどうかを調べている。

If oneLine.Contains(txtNumber.Text) = True Then
  iCount = iCount + 1
End If

 Containsメソッドは、引数に指定した文字列が元の文字列に含まれているときにTrueを返すので、戻り値を見れば文字列が含まれているかどうかが分かるというわけだ。ただし、検索文字列が""(空文字列)でもTrueが返されることに注意。


 INDEX
  連載:VB 6ユーザーのためのこれならマスターできるVB 2005超入門
  第8回 ファイル入出力をマスターしよう
    1.サンプル・プログラム10 − テキスト・ファイルの検索プログラム
  2.テキスト・ファイルからデータを読み出せるようにするには
    3.サンプル・プログラム11 − ランダム・アクセスでデータを読み出すには
    4.サンプル・プログラム12 − ファイルに追加書き込みするには
 
インデックス・ページヘ  「これならマスターできるVB 2005超入門」


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