TextStreamについて

テキストファイルの読み書きを行うためのTextStreamオブジェクトの操作について、いくつかのサンプルを作成しながら勉強していきます!

TextStreamオブジェクトを作成する方法は、以下の記事が参考になりますので、そちらを見てください!(手抜きじゃないよw)

■TextStreamオブジェクト

テキストファイルへのアクセスを助けてくれるオブジェクトですね!

広告

FileSystemObjectのCreateTextFileメソッドやOpenTextFileメソッドにて取得できるオブジェクトです

・構文

構文は以下の通りです

TextStream. { property | method }

FileSystemObjectから返されたTextStreamオブジェクトに関連づいている任意のプロパティとメソッドを呼び出します

・メソッド

オブジェクトのメソッドは以下の通りです

  • Close … 開いているTextStreamファイルを閉じる
  • Read … 指定された数の文字をTextStreamファイルから読み取って返す
  • ReadAll … TextStreamファイル全体を読み取って返す
  • ReadLine … TextStreamファイルから1行を読み取って返す
  • Skip … TextStreamファイルを読み込むときに、指定された数の文字を読み飛ばす
  • SkipLine … TextStreamファイルを読み取るときに次の行を読み飛ばす
  • Write … 指定されたテキストをTextStreamファイルに書き込む
  • WriteBlankLines … 指定された数の改行文字をTextStreamファイルに書き込む
  • WriteLine … 指定されたテキストと改行文字をTextStreamファイルに書き込む

ファイルアクセスと言えば、読み書きですね!

TextStreamオブジェクトを作るのは、FileSystemObjectのメソッドですが、閉じるときは、作成したTextStreamオブジェクトのCloseメソッドで閉じます

いつも気になりますが、ReadメソッドやSkipメソッドで書かれている「指定された数の文字」というのは、文字数なの?バイト数なの?と・・w

・プロパティ

オブジェクトのプロパティは以下の通りです

  • AtEndOfLine … ファイルポインタがTextStreamファイルの行末の直前にあるかどうか
  • AtEndOfStream … ファイルポインタがTextStreamファイルの末尾にあるかどうか
  • Column … 入力ストリームの現在の文字位置の列番号を返す
  • Line … TextStreamファイルの現在の行番号を返す

AtEndOfLine プロパティとAtEndOfStreamプロパティの違いがいまいちわかっていませんw

行単位アクセスのReadLineメソッドを使う場合は、AtEndOfLine プロパティなのかな?

文字単位アクセスのReadメソッドを使う場合は、AtEndOfStream プロパティなのかな?

サンプルでその辺りを見ていきたいと思います

■例

・簡単なサンプル(参照設定あり)

①-1:CreateTextFileのサンプル

FileSystemObjectを作成し、CreateTextFileメソッドで新規ファイルのフルパスを指定して、新しいTextStreamオブジェクトを生成します

①-1では、新規ファイルを作成する場合に、作成したファイルの書き込み用のTextStreamオブジェクトを [oText] に取得しています

②-1:OpenTextFileのサンプル

FileSystemObjectを作成し、OpenTextFileメソッドで既存ファイルのフルパスを指定して、新しいTextStreamオブジェクトを生成します

②-1では、既存ファイルを開いた場合に、読み取り可能なTextStreamオブジェクトを[oText] に取得しています

③-1:呼び出し元関数のサンプル

参照設定を使用したサンプル①-1と②-1を呼び出して、ファイルへの書き込みとファイルからの読み出しを行っています

・簡単なサンプル(参照設定なし)

上記の参照設定ありのサンプルを参照設定なしで書き直してみます

FileSystemObjectも引数でもらえばスッキリします(多くの人がその方法を選ぶでしょうw)

ただ、その場合、関数化の意味もほとんどなくなりますけどねw

広告

①-2:CreateTextFileのサンプル

参照設定を使用しない場合、引数のTextStreamオブジェクトもObject型になることに注意してください

②-2:OpenTextFileのサンプル

③-2:呼び出し元関数のサンプル

③-1とほとんど変わりなく作成することができます

これこそがCreateTextFileメソッドやOpenTextFileメソッドを関数化して呼び出すことの価値です!

ファイルを作成や開いて、読み書きすることに、FileSystemObjectが参照設定されているかどうかは関係ありませんからねー

出力結果としては①-1、②-1、③-1も、①-2、②-2、③-2も同じになります

TextStreamについて 3
出力結果

・AtEndOfStreamとAtEndOfLineの違い

プロパティで気になったAtEndOfLineとAtEndOfStreamの違いを確認していきますが、使用するのはReadLineメソッドに揃えていきます

④:呼び出し元関数のサンプル

④の出力結果

出力結果を見てみましょう!

出力結果
出力結果

AtEndOfStreamではファイルの最後まで読み込むことができましたが、AtEndOfLineでは最初の空行の直前で止まってしまい、ファイルを最後まで読み込むことができませんでした

AtEndOfLineは思っていた動きとかなり違いがありました

1行毎に終了するのかと思っていたので、空行で終了したことが驚きです

・ReadとSkipを試す

ReadとSkipでは数を指定できるとあります

VBAだからきっと文字数の指定なのだと思いますが、確認していきます

⑤:呼び出し元関数のサンプル

ReadメソッドとSkipメソッドで指定できる数について確認しています
出力結果は以下のようになります

・説明

④を見てもわかるように、想像していた「ReadLineメソッドの場合に、AtEndOfLineプロパティを使う」というのは外れていますねw

AtEndOfLineは、空行で止まることがわかったが、この後、何をすればいいんだろうか?謎が深まるw

⑤のサンプルの実行結果を見る限り、引数で指定できるのはバイト数ではなく、文字数であることがわかりますね!
改行コードも1文字としてカウントされていることがわかります

・注意点

  • AtEndOfLineプロパティの使い道がわからんw
  • TestStreamオブジェクトには、読み取り専用か、書き込み専用かのプロパティを持っていない
  • 読み取り専用でも(ファイルポインタの)現在地はわかるが、先頭に戻ることはできない
  • 書き込み専用でも保存するメソッドはない(Closeメソッド?)
  • 書き込み専用ではプロパティへのアクセスは許可されていない
  • ReadメソッドもSkipメソッドもAtEndOfStreamプロパティを確認してから実行すること

・その他

サンプルの中でほぼ全て(ReadAllとSkipLineメソッド以外)のメンバーを使用しましたから、個別に書く必要はなさそうですかね?w

  • ReadAllメソッドは、ファイル全てを読み出すということは、メソッド名からもわかりますね
  • SkipLineメソッドは、引数で指定した行数分を読み飛ばすということは、ReadLineメソッドと比較しても理解できそうですね

ではでは

シェア
広告

やもす ʕ•͡-•ʔ

のんびり!のほほん!がモットーです!w 蕎麦食いたい ライブ行きたい 暑いの嫌い