前章では、キーボードから入力したデータをファイルに書き込む(補助記憶装置に記憶する)プログラムを通して、コンピュータでのファイルについての基本を学びました。本章では、前章で作成したファイルを読み込むプログラムを通して、もう少しファイルを効果的に使うことを覚えましょう。前章同様、Word、Excelなどをすでに使っていて、ファイルについての基本知識がある方は※の節は読み飛ばしていただいてかまいません。
【補助記憶装置とファイル】※
前章では説明を省略しましたが、ドライブ名、フォルダ(ディレクトリ)、ファイルパスについてお話します。
[ドライブとフォルダ(ディレクトリ)]
図15-1.補助記憶装置のいろいろ
前章では補助記憶装置の説明としてCD/DVDドライブをとり上げましたが、補助記憶装置には図15-1のようにいろいろなものがあります。それぞれの装置の詳しい構造を知ることは本カテゴリーの目的から外れますのでここでは説明しませんが、外見からはわからなくともどの装置も駆動部、アクセス部(コントローラ)と記録媒体(不揮発性メモリ)で成り立っていることは共通しています。これらの補助記憶装置をすべてパソコンに接続した上で、WindowsシステムツールのPCを開くと図15-2のように表示されます。
図15-2.複数の補助記憶装置が接続された状態
図15-2の下半分のデバイスとドライブの部分を見ると現在接続されている補助記憶装置がわかります。ここで各装置のところに表示されているTIH0422000AやHD-PCGU3-Aなどをボリュームラベル(ボリューム名)といい、各補助記憶装置に付けられている名前とお考えください。ボリュームラベルはご自分の好きな名前に付け替えることができます。ボリュームラベルの後ろの(C:)や(F:)をドライブ名といいます(ドライブ名はお使いのパソコンにより異なります)。ボリュームラベルは長くて煩雑なので、プログラム中で補助記憶装置を扱うときはドライブ名を用います。
では、前章で作成したファイル、meibo.txtはどこに入っているのでしょうか。結論を先に言うとTiny Basic for Window(TBasic)sの場合、
OPEN "meibo.txt" FOR OUTPUT AS #1
のようにファイルパスを指定しないデフォルトの状態でファイルを作成するプログラムを走らせると、Tbasic.exeと同じ場所にファイルが出来ます。ここではTiny Basic for Windowsをusbメモリにインストール(【第0章】実習の準備参照)したものとして考えます。デバイスとドライブのTBasic.exeが入っているドライブをダブルクリックしてください(この例ではUSBメモリ)。すると図15-3のように表示されます。
図15-3.USBメモリをダブルクリックしたところ
黄色いノートみたいなアイコンが並んでいますが、これをフォルダ(ディレクトリ)といいます。1個のusbメモリを複数の目的に使う場合、ファイルをそのままでどんどん書き込んでいくと、後で見た時に「この作業に必要なファイルはどれだっけ」と探すのが大変になります。そこで目的別にファイルを分類しておくために、フォルダを作って、その中にファイルを書き込むようにします。この例ではTBasicというフォルダにTiny Basic for Windowsが入っています。ではTBasicというフォルダをダブルクリックしてみましょう。今度は図15-4のように表示されます。
図15-4.TBasicフォルダを開いたところ
Tiny Basic for Windows本体のTBasic.exeと前章で作成したプログラムとmeibo.txtという名のファイルが同じフォルダ内にあるのが確認できます。他にもいろいろなフォルダやファイルがありますが、これらはTiny Basic for Windowsをインストールしたときに自動的にコピーされたドキュメントやサンプルプログラムです。ここでmeibo.txtをダブルクリックするとWindows附録のメモ帳が起動し、中身を見ることができます(拡張子が .txt のファイルをダブルクリックすると自動的にメモ中が起動します)。ここでこのファイルの内容をメモ帳で変更・編集しないようにしてください。Enterキー(Returnキー)もダメです。ファイルの内容を変更・編集すると後で不具合が起こることがありますので充分気を付けてください。ファイルの内容が確認できたら、メモ帳を閉じてください。
1,青山 一丁目,アオヤマ イッチョウメ
2,秋田 鳥海,アキタ チョウカイ
3,麻布 十番,アザブ ジュウバン
4,石川 鶴来,イシカワ ツルギ
5,宇和島 愛媛,ウワジマ エヒメ
6,神奈川 鶴見,カナガワ ツルミ
7,島根 松江,シマネ マツエ
8,徳島 鳴門,トクシマ ナルト
9,長野 善光寺,ナガノ ゼンコウジ
10,盛岡 冷麺,モリオカ レイメン
図15-5.meibo.txtをメモ帳で開いたところ
[ファイルパス]
ここでいうパスとはpass(通行証/合格)ではなくpath(経路/道)です。対象のファイルまで辿り着く経路ということですが、前章で作成したmeibo.txtは図15-2から15-4のとおりの場所に作成されているとすると
Dドライブ(の媒体)の中のTBasicというフォルダの中のmeibo.txtというファイル
ということになります。これをTiny Basicでは
"D:¥TBasic¥meibo.txt"(¥はお使いのOS/ブラウザによっては\と表示されているかもしれません)
と書きます。ファイルパスの書き方は
ドライブ名:¥フォルダ名¥フォルダ名・・・・¥ファイル名
です。ファイルバスのうちドライブ名からフォルダ名は省略可能ですが、省略した場合(デフオルトのファイルパス)は、Tiny Basicの場合、TBasic.exeが入っている場所と同じ場所を指定したものとみなされます。
【ファイルを読み込むプログラム】
では、このmeibo.txtというファイルを読み込んで内容を表示するプログラムを作ります。手順は
①ファイルをINPUTモードで開く
②ファイルの内容を1行(1レコード)ずつ読み込み内容を表示する
③ファイルを閉じる
となります。プログラムは図15-6のようになります。2行目が手順①、3~6のWHILEブロックが手順②、7行目が手順③になります。
1:PRINT "*****名簿ファイル読み込み*****"
2:OPEN "D:\TBasic\meibo.txt" FOR INPUT AS #1
3:WHILE NOT EOF(1)
4: INPUT #1,BANGO,NAMAE$,KANA$
5: PRINT BANGO;" ";NAMAE$,KANA$
6:WEND
7:CLOSE #1
8:END
図15-6.ファイルを読み込むプログラム
ファイルの終わりを検知する
3行目にEOFというのが新しく出てきました。これはファイルの内容を1行ずつ読み込んでいって最後の行を読み終わったときtrue(真)となる関数です。End Of Fileの意味です。
EOF(ファイル番号)
のように書きます。
したがって、3~6行目のWHILEブロックは「ファイル番号1のファイル中のレコードをすべて読み込み終わるまで」ということになります。
ファイルの中身を読み込むにはINPUT命令を使いますが、INPUTの後ろに#ファイル番号を付けます(4行目)。次のように書きます。
INPUT #ファイル番号,変数,変数・・・・変数
今の例では1レコードのアイテムは番号(数値),名前(ストリング),ヨミガナ(ストリング)の順に並んでいるので、INPUT #1以後の変数の並びもこの型のとおりに合わせます(4行目)
5行目は読み込んだレコードの内容を表示しています。
これで最初の青山 一丁目さんから最後の盛岡 冷麺さんまで名簿ファイル中のすべてのレコードを読み込んで表示します。レコードを読み込んだところで、次のレコードがもうない(今読み込んだレコードが最後)だとEOFの値はtrue(真)になります。よって3行目のWHILE文に戻ったとき繰り返し終了条件は満たしたと判断され、WHILEブロックを抜けて7行目以降に移ります。ここで今使用したファイルを閉じてプログラム終了です。
【ファイルを2つ使うプログラム】
本カテゴリーで作成するプログラムもいよいよ最後となりました。ここでは少し実用的なプログラムをやってみましょう。といってもいきなり今までやってなかった命令や関数が出てくるわけではありません。ここまでで学んだ知識を組み合わせてできる範囲ですから、安心してください。
[プログラムの概要]
クラス名簿マスタファイルを読み込み、各々の生徒の試験の点数を入力し、試験データファイルを作成する
マスタファイルとは大元のファイルで内容が変わることは滅多にないもの、データファイルとは内容が変わることが頻繁にあるファイルです。
ファイル・レコードの形式
名簿マスタファイル
番号(数値),名前(ストリング),ヨミガナ(ストリング)
試験データファイル
番号(数値),点数(数値)
試験の点数
0点以上100点以下とする
図15-7.ファイルを複数使うプログラムのイメージ
1:PRINT "***** 試験の点数入力 *****"
2:INPUT "開始しますか(YES=1)",STARTOK$
3:IF STARTOK$<>"1" THEN
4: END
5:END IF
6:OPEN "meibo.txt" FOR INPUT AS #1
7:OPEN "shiken.txt" FOR OUTPUT AS #2
8:WHILE NOT EOF(1)
9: INPUT #1,BANGO,NAMAE$,KANA$
10: YN$=""
11: WHILE YN$<>"1"
12: PRINT BANGO;" ";NAMAE$,KANA$
13: DATAOK=0
14: WHILE DATAOK<>1
15: INPUT "点数(0-100)",TEN
16: IF TEN=>0 AND TEN<=100 THEN
17: DATAOK = 1
18: ELSE
19: PRINT "点数は0から100までです"
20: END IF
21: WEND
22: INPUT "これでよろしいですか(YES=1)",YN$
23: WEND
24: PRINT #2,BANGO;",";NAMAE$;",";KANA$;",";TEN
25:WEND
26:CLOSE #1,#2
27:END
1~5行目 誤実行防止
6行目 名簿マスタファイルを入力専用、ファイル番号1で開く
7行目 試験データファイルを出力専用、ファイル番号2で開く
8~25行目 名簿マスタファイルの全レコードを読み終わるまで繰り返す
9行目 名簿マスタファイルのレコード1件分の読み込み
11~23行目 入力した試験の点数が間違いなくなるまで繰り返す
12行目 今読み込んだレコードの内容を表示
14~21行目 入力した点数が正しくなるまで(0~100点の範囲内)になるまで繰り返す
22行目 入力した点数の確認
24行目 試験データファイルに出力
26行目 使用したファイルを閉じる