前章ではキーボードから入力したデータをファイルに書き込むプログラムを作りました。この章では前章で作成したファイルを読み込むプログラムと複数のファイルを使うプログラムを作ります。第11章でやった試験の成績処理のプログラムを完成させます。
【ファイルを読み込むプログラム】
前章で作成した meibo.txt というファイルを読み込んで内容を表示するプログラムを作ります。meibo.txt は seiseki_shoriフォルダに保存されています。このプログラムも seiseki_shoriフォルダに保存するとします。手順は
①ファイルをINPUTモードで開く
②ファイルの内容を1行(1レコード)ずつ読み込み内容を表示する
③ファイルを閉じる
となります。プログラムは図17-1のようになります。2行目が手順①、3~6のWHILEブロックが手順②、7行目が手順③になります。
1:PRINT "*****名簿ファイル読み込み*****"
2:OPEN "meibo.txt" FOR INPUT AS #1
3:WHILE NOT EOF(1)
4: INPUT #1,BANGO,NAMAE$,KANA$
5: PRINT BANGO$;TAB(8);NAMAE$;TAB(20);KANA$
6:WEND
7:CLOSE #1
8:END
図17-1.ファイルを読み込むプログラム
ファイルの終わりを検知する
3行目にEOFというのが新しく出てきました。これはファイルの内容を1行ずつ読み込んでいって最後の行を読み終わったときtrue(真)となる関数です。End Of Fileの意味です。
EOF(ファイル番号)
のように書きます。
したがって、3~6行目のWHILEブロックは「ファイル番号1のファイル中のレコードをすべて読み込み終わるまで」ということになります。
ファイルの中身を読み込むにはINPUT #命令を使います。INPUTの後ろに#ファイル番号を付けます(4行目)。次のように書きます。
INPUT #ファイル番号,変数,変数・・・・変数
図17-2.meibo.txtの内容
meibo.txtの中身は図17-2のようになっていました。1レコードのアイテムは番号(ストリング),名前(ストリング),ヨミガナ(ストリング)の順に並んでいるので、INPUT #1以後の変数の並びもこの型のとおりに合わせます(4行目)
5行目は読み込んだレコードの内容を表示しています。
これで最初の相沢 義明さんから最後の増川 幸雄さんまで名簿ファイル中のすべてのレコードを読み込んで表示します(図17-3)。レコードを読み込んだところで、次のレコードがもうない(今読み込んだレコードが最後)だとEOFの値はtrue(真)になります。よって3行目のWHILE文に戻ったとき繰り返し終了条件は満たしたと判断され、WHILEブロックを抜けて7行目以降に移ります。ここで今使用したファイルを閉じてプログラム終了です。
図17-3.ファイルを読み込むプログラム実行結果
【ファイルを使うプログラムの怖さ】
プログラムの論理エラー、オペレータの誤操作は深刻なトラブルにつながることはよくきく話ですが、ファイルを使うプログラムではとくにそうです。典型的なものとして
①ファイルを作成してはいけない場所(ドライブ/フォルダ)に作成してしまい情報が漏洩してしまった
②システム全体で共有するファイルに対して編集・削除プログラムを実行してしまいシステム全体がダウンしてしまった
③データが蓄積していたファイルを OUTPUT モードで OPEN してしまい長年の苦労が一瞬にして水の泡になった
④データ誤入力が原因で誤った処理結果をファイルに書き込んでしまい多くのお客様に被害が及んだ
などです。こういうことを防止するためには日頃から大切なファイルはバックアップ(ファイルのコピー)をとることを習慣づけることも大切ですが、プログラムにも誤実行・誤操作防止を施しておくに越したことはありません。ここで作るプログラムではこのようなシステムトラブルを極力防止することも考えます。といってもいきなり今までやってなかった命令や関数が出てくるわけではありません。ここまでで学んだ知識を組み合わせでできることです。
【複数のファイルを使うプログラム】
本カテゴリーも終着駅に近づいてきました(また鉄道ネタ💦)。ここでは複数のファイルを使うプログラムをやってみましょう。
クラス名簿マスタファイルを読み込み、各々の生徒の試験の点数を入力し、試験データファイルを作成するプログラムを作ります。
マスタファイルとは大元のファイルで内容が変わることは滅多にないもの、これに対し、試験の成績は内容が変動することが頻繁にあるファイルです。このようなファイルのことをトランザクションファイルという場合もありますが今日ではトランザクションとは「取引」「商売」の意味ですが、今日のITの世界ではでは「ここからここまで一連の処理」の意味で使われるのが普通なので、当カテゴリーではデータファイルとよぶことにします。
[ファイル・レコードの形式]
名簿マスタファイル
番号(数値),名前(ストリング),ヨミガナ(ストリング)
試験データファイル
番号(数値),氏名(ストリング),ヨミガナ(ストリング),点数(数値)
※普通に考えれば試験データファイルには氏名、ヨミガナは書き込む必要はありません。後で試験の結果を見る時は出席番号で名簿マスタファイルを検索するようにすればよいからです(たとえば1年1組1番という生徒は1人しかいません)。ここではマスタファイルの内容も試験データファイルに書き込むようにしています。これは万一マスタファイルが破損する事故が発生した場合、データファイルから復旧するのが簡単にできるようにするためです。
[入力データ]
試験の点数は0点以上100点以下とする
図17-4.ファイルを複数使うプログラムのイメージ
このプログラムではWHILE~WEND制御文のネスティングとIF制御文で実現します。プログラムの詳細な流れは次のようになります。
プログラム開始部分
IF プログラム開始OKでなければプログラム実行終了(誤実行防止)
プログラムメイン部分
WHILE① マスタファイルの全レコードを読み込み終わるまで
読み込んだデータを表示(誤入力防止)
WHILE② 入力した点数を確認してOKになるまで(誤入力防止)
WHILE③ 正しいデータが入力されるまで(誤データ防止)
点数入力
WEND③
入力した点数表示
WEND②
WEND①
プログラム終了
これに基づいて作ったプログラムは次のようになります。
1:' ***********************************
2:' * 試験の成績入力プログラム *
3:' * ver.1.0()2023/05/07) *
4:' * (制作責任者) *
5:' * ○○市立凸凹中学校 *
6:' * 徳川 卑弥子 *
7:' * himiko@example.co.jp *
8:' ***********************************
9:' *** 初期処理 ***
10:PRINT "***** 試験の点数入力 *****"
11:' 実行可否確認
12:INPUT "開始しますか(YES=1)",STARTOK$
13: IF STARTOK$<>"1" THEN
14: END
15: END IF
16:' ファイルOPEN
17:OPEN "meibo.txt" FOR INPUT AS #1 :' 名簿マスタファイル
18:OPEN "shiken.txt" FOR OUTPUT AS #2 :' 試験データファイル
19:' *** メイン処理 ***
20:WHILE NOT EOF(1)
21: INPUT #1,BANGO,NAMAE$,KANA$
22: ' 入力内容がOKになるまで
23: YN$=""
24: WHILE YN$<>"1"
25: PRINT BANGO;" ";NAMAE$,KANA$
26: ' 正しいデータが入力されるまで
27: DATAOK=0
28: WHILE DATAOK<>1
29: INPUT "点数(0-100)",TEN
30: ' 入力内容チェック
31: IF TEN=>0 AND TEN<=100 THEN
32: ' 0点以上100点以下ならOK
33: DATAOK = 1
34: ELSE
35: ' 0~100以外が入力されたとき
36: PRINT "点数は0から100までです"
37: END IF
38: WEND
39: ' 入力内容の確認
40: PRINT BANGO,NAMAE$,KANA$,TEN
41: INPUT "これでよろしいですか(YES=1)",YN$
42: WEND
43: PRINT #2,BANGO;",";NAMAE$;",";KANA$;",";TEN
44:WEND
45:' プログラム終了
46:CLOSE #1,#2
47:END
図17-5.試験の成績入力プログラム
[プログラムの説明]
1~5行目 プログラムの説明
このプログラムを使う人がプログラム作成者1人だけならともかく、みんなで使うプログラムなら、どういうプログラムで、ver.情報、プログラム制作者(問い合わせ先)などの情報を注釈文で載せるようにしましょう。
10~15行目 誤実行防止
本当に実行してよいかオペレーターに確認します。実行してよければ 1 を入力します。これ以外の文字が入力された場合は安全のため実行を中止するようにしています。
17行目 名簿マスタファイルを入力専用、ファイル番号1で開く
18行目 試験データファイルを出力専用、ファイル番号2で開く
ファイル番号が異なっていれば複数のファイルを同時に OPEN できます。使用モードが異なっていてもOKです。
20~44行目 名簿マスタファイルの全レコードを読み終わるまで繰り返す
21行目 名簿マスタファイルのレコード1件分の読み込み
23~42行目 入力した試験の点数が間違いなくなるまで繰り返す
25行目 今読み込んだレコードの内容を表示
27~38行目 入力した点数が正しくなるまで(0~100点の範囲内)になるまで繰り返す
41行目 入力した点数の確認
43行目 試験データファイルに出力
46行目 使用したファイル閉じる
実行すると次のようになります。
図17-6.実行可否の確認
プログラムが開始されると最初に実行してよいかどうかの確認を求められます(図17-6)。ここでOK(=1)以外を応答するとプログラムの実行を中止します(試験データファイルは新規作成されません)。
図17-7.メイン処理
*1)実行可否の確認(誤実行防止)
*2)マスタファイルから読み込んだ内容を表示(誤入力防止)
*3)誤データ防止
*4)入力やり直し
*5)入力内容確認したところ間違っていたのでYes(=1)以外を応答
*6)正しいデータを入力し直し再度確認
*7)書き込み完了し、次のデータ入力へ
このようにして試験の成績をファイルに書き込んでおけば、今度はこのファイルを読み込んで、平均点を求めたり、各々の生徒の点数が平均点とどれだけ離れているかなどを求めることができます。プログラムは次のようになります。このプログラムでは試験データファイルから平均点を求めた後、いったんファイルをCLOSE(19行目)、その後ファイルを再OPEN(27行目)し、もう一度各自の点数を読み込みながら、平均点との差を求めています。このように1つのファイルはCLOSEすれば再オープンしてデータを始めから読み込み直すことができます。
1:' ***********************************
2:' * 試験の結果分析プログラム *
3:' * ver.1.0(2023/05/08) *
4:' * (制作責任者) *
5:' * ○○市立凸凹中学校 *
6:' * 徳川 卑弥子 *
7:' * himiko@example.co.jp *
8:' ***********************************
9:' *** 初期処理 ***
10:PRINT "***テストの結果分析***"
11:GOKEI=0
12:NINZU=0
13:OPEN "shiken.txt" FOR INPUT AS #1
14:WHILE NOT EOF(1)
15: INPUT #1,NUM,SHIMEI$,KANA$,TEN
16: GOKEI=GOKEI+TEN
17: NINZU=NINZU+1
18:WEND
19:CLOSE #1
20:' いったん試験データファイルをCLOSE
21:' 平均点と、各自の得点と平均点の差を求めて表示
22:HEIKIN=INT(GOKEI/NINZU)
23:PRINT USING "受験者は ###人";NINZU
24:PRINT USING "平均点は ###点";HEIKIN
25:PRINT
26:' 各自の得点と平均点との差を求める
27:OPEN "shiken.txt" FOR INPUT AS #1 ' 試験データファイルを再OPEN
28:WHILE NOT EOF(1)
29: INPUT #1,NUM,SHIMEI$,KANA$,TEN
30: TENSA=TEN-HEIKIN
31: PRINT USING " ### ";NUM;
32: PRINT SHIMEI$;" (";KANA$;")"; ' 出席番号、氏名、ヨミガナを表示
33: PRINT TAB(32);
34: PRINT USING " ### (###)";TEN;TENSA ' 得点と平均点との差を表示
35:WEND
36:CLOSE #1
37:END
図17-8.試験データファイルを読み込んで平均点等を求めるプログラム
図17-9.図17-8のプログラム実行結果
図17-9を見てあれっと思った方もいらっしゃるでしょう。これは第11章でやったプログラムと結果は同じです。また図17-5のプログラムならマスタファイルを作らなくても第12章で覚えたDATA文でプログラム中に置いた名簿データを遣えばわくね?はい、もっともな疑問です。どうしてわざわざファイルを使うのでしょう。
ここで思い出していただきたいのは、主記憶装置に記憶された内容は、コンピュータを再起動するかシャットダウンすればすべて消えてしまうということです。配列(配列変数)に代入された内容もまた主記憶装置に記憶されているものです。またDATA文もプログラム中に置かれているものです。また他のプログラムとDATA文の内容を共有するというのも、かなりやっかいです。
しかし補助記憶装置にファイルとして記憶されたデータは、その補助記憶媒体を破損しない限り、半永久的に保存・再利用が可能です。たとえばここで入力した試験の点数が中間試験のもので期末試験の点数をこれに書き加えて、三者面談の時、保護者に渡す資料を作りたいという場合、中間試験の点数が保存されていてこれが再利用できれば簡単にできます。>b?ファイルに保存したデータは半永久的に再利用ができる、といすうことを覚えておきましょう。
【この章のまとめ】
ファイルからデータを読み込むには入力モード(INPUT)で開く
ファイルからデータを読み込むときは INPUT #(ファイル番号)命令を使う
ファイルを使うプログラムでは誤実行・誤操作・誤データなどが深刻なシステム障害につながることが多い
ファイル(補助記憶装置)に書き込んだデータは半永久的に保存・再利用が可能である
前章でお話したとおり、補助記憶装置を使うには、準備から使用後の跡片付けまで、すべてプログラムでやらなければなりません。ファイルへの読み書きの大まかな流れはこうなります。
(1)ファイルのOPEN(補助記憶装置を使う準備)
(2)ファイルの読み書き
(3)ファイルのCLOSE(後片付け)
【ファイルのOPEN】
ファイルの使用準備にはOPEN命令を使います。
OPEN ファイルパス FOR 使用モード AS ファイル番号
ファイルパスは" "で囲みます(プログラム中ではストリングとして扱われます)
使用モードは
OUTPUT ファィル新規作成するとき
同じ名前のファイルがある場合、いったん内容がすべて消去されます。
APPEND 既存のファイルへの追加書き込みするとき
INPUT ファイルの内容を読み込むとき
Tiny Basicで扱えるファイルは順編成ファイル(書き込んだ順にデータが並ぶ、並んでいる順にデータが読み込まれるファイル)で、ランダムな順での読み書き、書き込み読み込みを同時に行なうことはできません。使用モードは必ず1つ選ばなくてはなりません。
ファイルにはプログラム内での番号が振られ、以後プログラム内では、このファイル番号が使われます。ファイル番号は正の整数で指定します。ファイル番号の書き方は
#正の整数
です。プログラム中では複数のファイルが使えます。筆者が今まで作ってきたプログラムで同時OPENは5つまで可能なことは確認しました(もっとたくさん使えるかもしれません)。
【ファイルの読み書き】
ファイルに書き込むにはPRINT命令、ファイルの内容を読み込むにはINPUT命令を使います。次のように書きます。
PRINT #(ファイル番号),1レコード分の書き込み・・・・ファイルへの書き込み
1件分の書き込みの部分は、画面への出力の場合と同じ書き方です。
INPUT #(ファイル番号),変数_1,データ_2・・・・1レコード分の読み込み
変数の型は、1レコード中のアイテムと一致させる必要があります。
【ファイルのCLOSE】
ファイルを使用したなら、後片付けをしなくてはなりません。とくにOUTPUT、APPENDモードで開いていた場合、後片付けを忘れると、それまでPRINT #で書き込んでいたいたはずのデータは実際にはファイルに反映されません。後片付けするにはCLOSE命令を使います。 CLOSE #(ファイル番号)
ファイル番号を省略するとそのときOPENしていたファイルすべてがCLOSEされます。
では、実際にファイルに書き込む(補助記憶装置にデータを記憶する)プログラムを作りながら詳しく説明します。これから先は今までさんざやってきたテストの成績処理のプログラムをファイルを使うように改造してゆくことにします。またテストの成績かよ!と思われたかもしれませんがこのカテゴリーも終点に近づいてきました。もう少しの間お付き合いください。
【ファイルに書き込むプログラム】
では、生徒名簿マスタファイルを作成するプログラムを作ってみましょう。マスタファイルとは内容が変動しない(変動することが滅多にない)ファイルのことです。ここでは生徒一人一人の出席番号、氏名、ヨミガナをファイルに書き込むことにします。
1: OPEN "meibo.txt" FOR OUTPUT AS #1
2: NUM$=""
3: WHILE NUM$<>"//"
4: INPUT "出席番号(//=入力終了)",NUM$
5: IF NUM$<>"//" THEN
6: INPUT "生徒氏名",NAMAE$
7: INPUT "ヨミガナ",KANA$
8: PRINT #1,NUM$;",";NAMAE$;",";KANA$
9: END IF
10: WEND
11: CLOSE #1
12: END
図16_1.ファイルに書き込むプログラム
1行目はファイルのOPENです。 meibo.txt という名前のファイルを新規作成します。同じ場所に meibo.txt という名前のファイルがあった場合、その内容はいったん消去されます。
3~10行目は入力終了になるまで繰り返されます。
4行目は出席番号の入力です。出席番号が // (入力終了の指示)でなければ、
6~8行目で生徒氏名、ヨミガナを入力してファイルに書き込みます(*)。
入力終わると11行目でファイルをCLOSEしてプログラム終了です。
(*)PRINT #でファイルに書き込む時、各アイテム間に , (半角カンマ)を書き込む必要があります。これがないと書き込む全部のアイテムが1つのストリングになってしまい、このファイルを読み込むプログラムがたいへんめんどうなことになります。
【Tiny Basicのプログラムとカレントディレクトリ】
あまり良いことではないのですが、図16_1のプログラムを作成して、保存をしないで実行してみました。結果は次のようになります。
図16-2.ファイルopenエラー(ディレクトリ不明)
これは「ファイルがOPENできませんでした」という実行時エラーです。プログラムの書き方にミスがあるわけではありません。なんでこんなことになったのかといいますと、プログラムを作成して保存していない状態ではカレントディレクトリがどこなのか確定していないからです。
ではプログラムを保存してから実行してみましょう。プログラム名はmeibo_generator、第4章でやった方法で保存することにします。保存したら実行してみましょう。
図16-3.ファイル新規作成プログラム実行中
実行が終わったらTiny Basicが入っているフォルダを開いて中身を見てみましょう。
図16-4.Tiny Basicの入っているフォルダ
このフォルダの中に、今作ったプログラム meibo_generator.tbtとプログラムで作成したファイル meibo.txt が入っているのがわかります。第4章でやった方法でプログラムを保存すると、Tiny Basicが入っているフォルダに保存されます。そしてTiny Basicではプログラムを保存してから実行するとカレントディレクトリはプログラムが保存されているフォルダに移ります。したがってファイルパスを指定せずにファイル名だけ指定してファイルをOUTPUTでOPENすると作成されるファイルもまたTiny Basicが入っているフォルダ内に作られます。
これでもプログラムの実行には問題ないのですが、自分のパソコン、共用パソコンの場合なら自分専用のUSBメモリやSDカードにTiny Basicが入っているという場合を除き、プログラムの運用上は問題大ありです。他部課に流してはいけないマル秘データファイルを作成するプログラムを会社や学校で共用のパソコンでパソコン内蔵のハードディスクに入っているTiny Basicで作成して実行したとしたら、誰でも中身が見られるフォルダの中にマル秘データを書き込んでしまうことになります。これは立派な情報漏洩です。
これを避けるにはカレントディレクトリが共用フォルダ以外になるようにすればいいのですが、今も言ったようにTiny Basicでは実行するプログラムが入っているフォルダがカレントディレクトリになるので、作ったプログラムをTiny Basicが入っているフォルダ以外の場所に保存するようにすればいいことになります。
【フォルダを新規作成してプログラムを保存する】
※Windowsのエクスプローラーの使い方がわかっていらっしゃる方は、この節は読み飛ばしていだだいてかまいません。
ここでは自分のUSBメモリに seiseki_shori というフォルダを作成し、ファイル作成プログラムを meibo_generator.tbt 、作成するファイルを meibo.txt として説明します。
図16-5.名前を付けて保存の画面
図16-5はUSBメモリをセットした状態でプログラム保存を名前を付けて保存するときの画面です。いちばん上の段はファイルを保存する場所(ドライブ/フォルダ)を選ぶところです。ここでセットしたUSBメモリを選んでクリックします。この例だと挿し込んだUSBメモリはHドライブです。すると図16-6のようにUSBメモリの内容が表示されます。このUSBメモリにはすでに kyozai、bukatsu という2つのフォルダがあるのがわかります。
図16-6.USBメモリを開いたところ
ここでUSBメモリの内容(この例なら2つのフォルダ)が表示されている領域内のどこでもいいのでマウスクリックをもっていって右クリックします。ポップアップメニューが出るのでここで新規作成を選びます。するとさらにサブメニューが出るのでここでフォルダーを選んでクリックします。
図16-7.フォルダ名を決める
ここでフォルダ名を決めます。すでにあるフォルダ名と同じ名前にはできません。
図16-8.新しいフォルダができた
新しいフォルダができました。以後このフォルダを専用フォルダとよびます。出来上がった専用フォルダをダブルクリックします。
図16-8.新しいフォルダにプログラムを保存
出来上がった専用フォルダの中にプログラムを保存します。プログラムを保存したら実行してみましょう。実行画面は図16-3と同じなので省略します。
図16-9.プログラム実行後の専用フォルダの中身
プログラム実行後の専用フォルダの内容をエクスプローラー見てみると、保存したプログラムとこのプログラムで作成したデータファイルがあるのがわかります。
図16-10.プログラムで作成したファイルの中身
作成したファイルの中身を確認してみましょう。拡張子が .txt のファイルをダブルクリックすると、Windowsの場合メモ帳(Notepad)が自動的に起動して、ファイルを読み込みます。ファイルの内容は図16-10のように、1件1件のレコードのアイテムが , (半角カンマ)で区切られています。ここでメモ帳(Notepad)でファイルの中身を編集しないように気をつけてください。Enterキー(Returnキー)を押すのもダメです。内容を確認したらメモ帳(Notepad)を閉じてください。
【この章のまとめ】
ファイルを使用するには、まずファイルを開く(OPEN)必要がある。
ファイルにデータを書き込むには新規作成モード(OUTPUT)か、追加モード(APPEND)モードで開く
新規作成モード(OUTPUT)でOPENすると、同名のファイルがすでに存在する場合、その内容がいったん消去される。
ファイルにデータを書き込むときは PRINT #(ファイル番号)命令を使う。
ファイルの使用が終わったら、ファイルを閉じる(CLOSE)する必要がある。
現在処理の対象になっているフォルダをカレントディレクトリという。
Tiny Basic for Windowsでは、実行するプログラムが保存されているフォルダがカレントディレクトリになる。
このカテゴリーもいよいよ終点に近づいてきました。この章以後ではファイルを使うプログラムについて学びます。ファイルについて勉強するには、ファイル名、拡張子、補助記憶装置(媒体)などについても知る必要があります。本カテゴリーの目的は「プログラミング体験」と「プログラミング的思考を身につける」ですから、Windowsパソコン初心者の方でもわかるよう、この辺は必要最小限の範囲にとどめ、なるべく平易に説明します。またWord、Excelなどをすでに使っていて、ファイルについての基本知識がある方はこの章は読み飛ばしていただいてかまいません。
またTiny Basic for Windowsではファイルを取り扱う方法は
①旧来の方法
②.NET Frameworkに対応した方法(新しい方法)
の2つがありますが、本カテゴリーではファイルとはどういうものかを知るために①の方法に基づいて説明します。
【ファイルとは】
図15-1は一般的にファイルとよばれているもので、○月分売上伝票とか○年○組生徒指導要録など、同じ種類(目的)の書類をまとめておくのに使われます。
コンピュータのファイルも基本的にはこれと同じで
①同じ種類(目的)のデータをまとめておくもの
です。ただコンピュータのファイルには
②ある目的のための材料箱というもの
もあります。本カテゴリーでは①の意味でのファイルについて中心にお話します。
図15-1.事務用品のファイル
【ファイル・レコード、アイテム】
ファイルとは同じ種類(目的)のデータをまとめておくものでした。たとえば担任クラスの生徒の名簿を考えてみます(図15-2)。
図15-2.名簿の例
これがファイルです。ファイルの中の1件1件のデータ(この例なら1行)をレコードといい、1件のレコードを構成する各項目(この例なら出席番号、氏名、ヨミガナ)をアイテムといいます。
プログラムを作るとき、最初に処理の手順(アルゴリズム)を考えたように、ファイルを使うには先にファイル設計をしておく必要があります。もし名簿が図15-3のようだったら、こんな名簿使いにくいことこの上ないですね。
図15-3.使いにくい名簿
このように1レコード中のアイテムの並びをどうするのか先に決めておくことが大切です。ここでは図15-2のように出席番号、氏名、ヨミガナの順としておきます。
【主記憶装置と補助記憶装置】
図15-4.コンピュータを構成する各装置
第4章で出てきたこの図をもう一度復習しましょう。今のノートパソコンでは一見してもわかりませんが、コンピュータの中身は図15-4のようになっています。今までやってきたプログラム、たとえば次のプログラムは、図15-4の主記憶装置より上の部分(中央処理装置=Central Processing Unit=CPU、入力装置、出力装置、主記憶装置)だけを使っています。
INPUT "A=",A
INPUT "B=",B
C=A+B
PRINT "A+B=";C
END
ファイルを使うプログラムでは補助記憶装置(固定ディスク装置、CD/DVDドライブ、USBメモリ、SDカードなど)も使います。まず主記憶装置と補助記憶装置はどう違うのかを知っておきましょう。
上のプログラムの場合、キーボードから入力された2つの数を、それぞれ変数A、Bに記憶します。このとき2つの変数は主記憶装置内に自動的に格納されます。これは主記憶装置はCPUが直接管理しているからです。これに対してデータを主記憶装置ではなく、補助記憶装置に記憶する場合、①使用するファイルを開く②データをファイルに書き込む③ファイルを閉じるというステップを踏まなくてはなりません。これは補助記憶装置はCPUが直接管理していないため、使うための準備から後始末まで、すべてプログラムでやらなくてはならないからです。
【補助記憶装置と補助記憶媒体】
ここで、何の説明もなく補助記憶装置という言葉を使いましたが、具体的な例でみてみましょう。目で見て最もわかりやすいCD/DVDドライブを例にとります。
図15-5.補助記憶装置(CD/DVDドライブ)
これはパソコン内蔵のCD/DVDドライブです。ここに音楽CDをセットすればパソコンをCDプレイヤーとして、映画やドラマなどのDVDをセットすればDVDプレイヤーとして使用することができます。そしてここに書き込み可能なCD-R、CD-RW、DVD-R、DVD-RW(以下、ディスクといいます)などをセットすれば、このCD/DVDドライブは補助記憶装置となります。上の写真をよく見ると、中心にセットしたCD、DVDを回転させる軸とディスクの内容を読み取ったり、ディスクにデータを書き込む光ヘッドがあるのが見えます。このような駆動装置、アクセス装置を総称して補助記憶装置といいます。
図15-6.補助記憶媒体(DVD-R)
この装置にセットするディスクのひとつが図15-6のDVD-Rです。補助記憶装置にセットして使用するディスク、USBメモリなどを補助記憶媒体(最近ではメディア、ストレージというようです)といいます。ファイルはこの補助記憶媒体に書き込まれます(記録されます)。
図15-7.補助記憶媒体を補助記憶装置にセットしたところ
このとおり補助記憶装置とは補助記憶媒体の内容を読み書きする装置のことなのですが、本カテゴリーでは煩雑さを避けるため補助記憶媒体をセットした状態(図15-7)を補助記憶装置と呼ぶことにします。
[主記憶装置と補助記憶装置の特性と欠点]
①記憶容量
一般的に主記憶装置と補助記憶装置では補助記憶装置の方が記憶容量が大きいです。筆者のパソコンの場合、主記憶装置の記憶容量は8GB(ギガバイト)ですが、使用している補助記憶装置はいちばん容量が小さいもので500GBほどです。今日ではコンビニで売ってるUSBメモリやSDカードでも32GB、64GBくらいが普通になっています。なので全校生徒(児童)の指導要録などの大量の(容量の大きい)データはファイルとして補助記憶装置に、計算結果や処理中のデータは保存の必要がない限り主記憶装置内だけで扱うようにします。
②速度
主記憶装置と補助記憶装置では主記憶装置の方が記憶・記憶内容の読み出しの速度が速いです。今日のパソコン用補助記憶装置で一般的な事務処理プログラム程度ではあまり意識する必要はありませんが、画像・音声・動画を大量に扱う場合、補助記憶媒体への書き込み速度はシステム全体の運用効率にかなり影響が出ます。
③保存性
最後にこの章で最も大事なことを知っておきましょう。それは補助記憶装置の記憶は媒体が物理的に破損するか記録内容を消去するプログラムを実行しない限り永久に残るということです。これに対して主記憶装置の記憶内容はパソコンの電源を切るかパソコンを再起動かけたところですべて消えます。なので永久に保存しておきたいデータは補助記憶装置に記憶させるようにします。
[ドライブとフォルダ(ディレクトリ)]
図15-8.補助記憶装置のいろいろ
前節では補助記憶装置の説明としてCD/DVDドライブをとり上げましたが、補助記憶装置には図15-8のようにいろいろなものがあります。それぞれの装置の詳しい構造を知ることは本カテゴリーの目的から外れますのでここでは説明しませんが、外見からはわからなくともどの装置も駆動部、アクセス部(コントローラ)と記録媒体(不揮発性メモリ)で成り立っていることは共通しています。これらの補助記憶装置をすべてパソコンに接続した上で、WindowsシステムツールのPCを開くと図15-9のように表示されます。
図15-9.複数の補助記憶装置が接続された状態
図15-9の下半分のデバイスとドライブの部分を見ると現在接続されている補助記憶装置がわかります。ここで各装置のところに表示されているTIH0422000AやHD-PCGU3-Aなどをボリュームラベル(ボリューム名)といい、各補助記憶装置に付けられている名前とお考えください。ボリュームラベルはご自分の好きな名前に付け替えることができます。ボリュームラベルの後ろの(C:)や(F:)をドライブ名といいます(ドライブ名はお使いのパソコンにより異なります)。ボリュームラベルは長くて煩雑なので、プログラム中で補助記憶装置を扱うときはドライブ名を用います。
では、これらの補助記憶装置にデータがどのように記録されているのかを見てみましょう。ここではTiny Basic for WindowsをUSBメモリにインストール(【第0章】実習の準備参照)したものとして考えます。デバイスとドライブのTBasic.exeが入っているドライブをダブルクリックしてください(この例ではUSBメモリ)。すると図15-10のように表示されます。
図15-10.USBメモリをダブルクリックしたところ
黄色いノートみたいなアイコンが並んでいますが、これをフォルダ(ディレクトリ)といいます。1個のUSBメモリを複数の目的に使う場合、ファイルをそのままでどんどん書き込んでいくと、後で見た時に「この作業に必要なファイルはどれだっけ」と探すのが大変になります。そこで目的別にファイルを分類しておくために、フォルダを作って、その中にファイルを書き込むようにします。この例ではTBasicというフォルダにTiny Basic for Windowsが入っています。ではTBasicというフォルダをダブルクリックしてみましょう。今度は図15-11のように表示されます。
図15-11.TBasicフォルダを開いたところ
Tiny Basic for Windows本体のTBasic.exeとTiny Basicが使用するいろいろなファイルが同じフォルダ内にあるのが確認できます。他にもいろいろなフォルダやファイルがありますが、これらはTiny Basic for Windowsをインストールしたときに自動的にコピーされたドキュメントやサンプルプログラムです。
[ファイルパス]
ここでいうパスとはpass(通行証/合格)ではなくpath(経路/道)です。対象のファイルまで辿り着く経路ということですが、Tiny Basic for Windowsの本体(TBasic.exe)が入っている場所を例にすると
Dドライブ(の媒体)の中のTBasicというフォルダの中のTBasic.exeというファイル
ということになります。これをTiny Basicでは
"D:¥TBasic¥TBasic.exe"(¥はお使いのOS/ブラウザによっては\と表示されているかもしれません)
と書きます。ファイルパスの書き方は
ドライブ名:¥フォルダ名¥フォルダ名・・・・¥ファイル名
です。ファイルバスのうちドライブ名からフォルダ名は省略可能ですが、省略した場合(デフオルトのファイルパス)は、Tiny Basicの場合、TBasic.exeが入っている場所と同じ場所を指定したものとみなされます。
【カレントディレクトリと絶対パスと相対パス】
今、ファイル操作(処理)の対象になっているフォルダ(ディレクトリ)のことをカレントディレクトリ(カレントフォルダ)といいます。そしてドライブ名からフォルダ名~・・・~ドライブ名~ファイル名で表すファイルパスを絶対パス、カレントディレクトリから見て目的のディレクトリの場所を示す表し方を相対パスといいます。下の図で説明します。
図15-12.絶対パスと相対パス
ここにA駅からB駅を通ってC駅・D駅を結ぶ鉄道があります。B駅でC駅方面とD駅方面は分岐します。今、A駅発C駅行きの電車が走っています。この電車がB駅に停まっているとき、B駅で降りる乗客を降ろしたりB駅から乗る乗客を乗せることはできますがC駅までの乗客を降ろすことは(事故・故障などがない限り)ありません。この場合、電車が停まっている駅がカレントディレクトリだと思ってください。そしてこの電車が走る経路(駅順)、A→B→Cが絶対パスです。
終点のC駅に着いた後、この電車はD駅行きになるとします。この場合、この電車はA駅まで戻る必要はなく、B駅まで戻って進行方向が変わりD駅に向かいます。この経路はC→1駅戻る→Dということになります。この表し方が相対パスです。筆者の趣味丸出しなたとえでごめんなさい💦💦
【この章のまとめ】
ファイルとは、同じ種類(目的)のデータをまとめておくもの、ある目的のための材料箱のことである。
補助記憶装置は主記憶装置と比べて大容量のデータを永久的に保存することが可能である。ただしアクセス速度は主記憶装置に比べて遅い。
ファイルを構成する1件1件のデータをレコード、レコードを構成する各データをアイテムという。
1つの補助記憶装置を複数の目的で使用する場合、目的別にファイルをまとめておくものをフォルダ(ディレクトリ)という。
ファイル操作の対象となっているフォルダをカレントディレクトリ(カレントフォルダ)という。
絶対パスとは目的のファイルまでの経路をドライブ名、フォルダ名~・・・ファイル名で表し方である。
目的のファイルまでをカレントディレクトリからの経路での表し方を相対パスという。