SmallBasicでプログラミング (3) ファイル操作
Small Basic はゲームやアニメーションといった、ホビー系のプログラミングに特化したプログラミング言語のように見えてしまうことが多いのですが、もちろんファイル操作などの実用的なプログラムを作るための機能を持っています。
今回は、Small Basic を使ってテキストファイル操作をするための方法を紹介します。
Small Basic でファイル操作をする際に使用するクラスは Fileクラスです。
ファイルの読み込みに使用するメソッドとして以下のようなものがあります。
File.ReadContents() ・・・ファイルからその内容をすべて読み込む
File.ReadLine() ・・・・ ファイルからその内容を一行読み込む
また、書き込みに使用するメソッドとして以下のようなものがあります。
File.WriteContents() ・・・ ファイルに対して内容を一気に書き込む
File.AppendContents() ・・・ ファイルに対して内容を一気に追加する
File.WriteLine() ・・・ ファイルに一行を書き込む
File.InsertLine() ・・・ ファイルに一行を追加する
一般的なプログラミング言語では、ファイル操作をする際には事前にファイルをオープンするという処理を施したり、操作を終了する前にはファイルをクローズして完結させたりしますが、Small Basic ではそのような処理は省略されています。いきなりファイルに対して読んだり書いたりといった処理を行うことができます。
なお、Fileクラスはディレクトリ操作(フォルダ操作)をする機能も備えていますが、それらは次回以降の記事で紹介したいと思います。
それでは早速、プログラムを作っていきましょう。
まずは、何かテキストファイル(ここではCドライブのTempフォルダ中にあるjikken.txt)からそのテキストデータを読み込み、画面に出力するプログラムです。
(実行画面)
たった2行ですが、ファイル中に存在するテキストデータをすべて画面に出力するだけならこれで実現できます。
1行目で C:\Temp\jikken.txt の内容を一気に読んで、その内容を変数 buf に入れています。
そしてその変数 buf の内容を画面に出力するために、TextWindow.Write() を使用しています。
この方法では、テキストファイルが1MBよりも小さい場合には高速に動作し、しかもプログラムをこのように非常に簡単になるので便利なのですが、ファイルが10MB以上になると速度が落ちるようです。
ただ、テキストファイルで1MBというとかなりの大きさです。
自分でメモ帳などのテキストエディタで手入力したようなファイルでは、1MBに到達することはかなり大変なことだと思います。
さて、この方法でファイルの読み込みをした場合、その読み込み対象のファイルが実際に存在しているかどうかを判定していないため、もしもファイルが何らかの理由で存在しなかった場合、正常に処理することができません。
そこで今度は、ファイルが存在するかどうかをあらかじめ判定するようにプログラムを変更してみましょう。
ファイルが存在するかどうかを判定するには、一度 File.ReadContents() を使ってそのファイルを読むふりをして、もしもその内容がカラであればそのファイルは存在しないと判断するのがもっとも簡単だと思います。
また、せっかくですから今回は、プログラムを実行するとファイル名とパスの入力をユーザーに促すようにしてみます。
ユーザーに文字入力を促すには、TextWindow.Read() を使います。
変数名 = TextWindow.Read()
のようにすることで、その変数にユーザーが入力した文字列を入力することができます。
もう一つ、ファイルが存在するかを判定する際に、もしも本当にファイルが存在しないようであればその先の処理をすべて飛ばして最後の方へジャンプする必要があります。
そのように、プログラムの中で強制的にジャンプをする際に使用するのがGoto文です。
ジャンプしたい場所にあらかじめ「ラベル名」を設定します。ラベル名を設定するには適当な名前の後ろに「:」をつけます。
以下の例では、tobasu という名前のラベル名が設定され、Goto文で一気にそこまでジャンプします。
それでは、プログラムを作ってみましょう。
以下のプログラムは、実行するとファイル名を聞いてきます。そこでファイル名(+パス名)を入力すると、そのファイルが存在するかどうかを判定し、もしも存在すればそのファイルの内容を画面に出力します。
もしもファイルが存在しなければ、ファイルが存在しない旨を表示して、Goto文を使ってプログラムの一番最後へとジャンプします。
実行するとファイル名を聞かれます。もしも存在しないファイル名を入力するとエラーメッセージが表示されて終了となります。
もう一つ、ファイルの読み込み処理のプログラムを作ってみます。
これまでのプログラムでは、File.ReadContens()を使ってファイルの内容を全部一気に読んでいたので、高速でかつプログラムも短くすることができたのですが、実際には一行ずつ読み込んだ方が汎用的と言えます。ファイルの1行1行に対して個別の処理をしたりすることができるからです。
また、前途の通り File.ReadContents() では1MBまでのファイルならば高速ですがそれ以上では遅くなってしまう可能性があります。
その点でも、ファイルから一行ずつ読み込む File.ReadLine() を使用した方が安全でもあります。
以下のプログラムは、c:\temp\jikken.txt から一行ずつ読み込み、それを配列 a に一行ずつ格納し、読み終わったら一行ずつ、行番号をつけながら画面に出力するものです。
配列とは、主に大量のデータを処理する際に向いている、変数の集合体のようなものです。
例えば変数a という変数には、文字列にせよ数値にせよ、格納できるデータは一つ(ひとまとまり)です。
しかし配列a[] という配列を用意すると、その中は a[1]、a[2]、a[3]・・・という番号付きの領域ができます。そしてその一個一個は、普通の変数と同じように使うことができます。
実行結果は以下のようになります。
プログラムの流れは以下の通りです。
2行目から8行目が、ファイルから一行ずつ読み込む処理をするループです。
配列a[] は、ファイルから読んだ行を一行ずつ格納します。 a[1]には一行目、a[2]には二行目・・・というように格納します。
ファイルから一行読む処理は3行目でしています。変数iが現在読んでいる行を示すようにしています。
ファイルの最後の行を読むと、空の内容が返されます。それを利用して、4行目~6行目で空行を読んだら11行目へとジャンプするようにしています。
画面への出力は11行目から14行目で行っています。読み込んだファイル中の行数はi-1行です。 変数iには読み込んだ行数より1多い値になってしまっているので、i-1とする必要があります。
なお、このプログラムは Goto文を多用していてあまり好ましくないので、本来ならば以下のような感じでループはWhile文などを使った方がいいかも知れません。
次はファイルへの書き込み処理を扱ってみましょう。
Small Basic でファイルへの書き込みをするには File.WriteContents() を使って一気にすべての内容をファイルに対して出力するか、もしくは File.WriteLine() を使って一行ずつ出力する方法があります。
ここでは File.WriteLine() を使って一行ずつ出力してみます。File.WriteLine() の使い方は、以下のプログラムを直接見ていただくのが早いと思います。
このように、第一引数には出力先のファイル名、第2引数には行番号(通常は連続した1からの番号を指定します)、第3引数には出力したい文字列を指定します。
また、通常は新規にファイルを作成する形で使用することが多いと思いますが、もしも出力ファイルがすでに存在している場合は、そのファイルの中の指定された行のみが置換されます。
それでは最後に、このファイルへの書き込みと、先に行ったファイルの行単位の読み込みを応用して、何かファイル(ここでは c:\temp\jikken.txt)からテキストを読み、そのテキストの各行に行番号をつけて別のファイル(ここでは c:\temp\jikken1.txt)に書きだす、というプログラムを作ってみましょう。
1行目~8行目でファイルの行単位の読み込みをしています。これは先に作成した読み込みのプログラムと同じです。
11行目~16行目でファイルへの書き込みをしています。こちらも特に特別なことはしておらず、先に使用した File.WriteLine() を繰り返し実行しています。
いかがでしょうか。
これらを応用して、ファイルに対して様々な処理を一括して行うといった、ビジネス系・実用系のプログラムを作ることも、Small Basic では可能になっています。
ぜひ、Small Basic を使って入門・ホビーのみならず、実用的なアプリケーションや、ちょっとしたビジネス系のアプリケーションを作成する際にも使っていただければ幸いです。