[BASICのはじめ方] Part17: データの保存と読み込み

BASIC

はじめに

プログラムを作っていると、「計算結果を次回起動時にも使いたい」「ゲームのハイスコアを記録したい」といった場面が出てきますよね? 🤔 プログラムを終了してもデータが消えずに残ることを「データの永続化」と言います。

前のステップ「ファイルの読み書き」では、OPEN, PRINT#, INPUT#, CLOSE といった基本的なファイル操作コマンドを学びました。今回は、これらのコマンドを応用して、プログラムで扱うデータをファイルに保存し、それを後で読み込む方法を具体的に見ていきましょう。💾📂

データをファイルに保存する (書き込み)

データをファイルに保存するには、主に以下の手順を踏みます。

  1. OPEN "ファイル名" FOR OUTPUT AS #ファイル番号 で書き込み用にファイルを開く。
  2. PRINT #ファイル番号, 保存したいデータ でファイルにデータを書き込む。
  3. CLOSE #ファイル番号 でファイルを閉じる。

ポイント:

  • OUTPUT モードで開くと、ファイルが既に存在する場合、中身は上書きされます。
  • 既存のファイルにデータを追加したい場合は APPEND モードを使います (OPEN "ファイル名" FOR APPEND AS #ファイル番号)。
  • CLOSE を忘れると、データが正しく保存されないことがあるので注意しましょう!🚨

例: ユーザー名とスコアを保存する

簡単な例として、ユーザーが入力した名前 (文字列) とスコア (数値) を “savedata.txt” というファイルに保存してみます。

' 変数の宣言
DIM username AS STRING
DIM score AS INTEGER

' ユーザーからの入力を受け取る
INPUT "名前を入力してください: ", username
INPUT "スコアを入力してください: ", score

' ファイルを開く (書き込みモード)
OPEN "savedata.txt" FOR OUTPUT AS #1

' データをファイルに書き込む (名前とスコアを別々の行に書き込む)
PRINT #1, username
PRINT #1, score

' ファイルを閉じる
CLOSE #1

PRINT "データを savedata.txt に保存しました。🎉"

このプログラムを実行すると、同じフォルダに “savedata.txt” というファイルが作成され、入力した名前とスコアがそれぞれ別の行に書き込まれているはずです。

ヒント: 複数のデータを保存する場合、後で読み込みやすいように、各データを改行で区切ったり、カンマ (,) で区切ったりするルールを決めておくと良いでしょう。今回の例では改行で区切っています。

ファイルからデータを読み込む (読み取り)

ファイルに保存したデータをプログラムで利用するには、以下の手順で読み込みます。

  1. OPEN "ファイル名" FOR INPUT AS #ファイル番号 で読み込み用にファイルを開く。
  2. INPUT #ファイル番号, 読み込み先の変数 でファイルからデータを読み込む。
  3. ファイルの終端 (EOF: End Of File) に達するまで読み込みを繰り返す (必要な場合)。
  4. CLOSE #ファイル番号 でファイルを閉じる。

ポイント:

  • INPUT モードで開くファイルが存在しない場合、エラーが発生することがあります。
  • INPUT # は、ファイルに書き込まれた形式に合わせてデータを読み取ろうとします。例えば、PRINT #1, "Taro", 100 のようにカンマ区切りで書き込んだ場合は、INPUT #1, name$, score% のように対応する変数で受け取る必要があります。改行で区切った場合は、INPUT #1 を複数回呼び出します。
  • ファイルからすべてのデータを読み込むには、EOF(ファイル番号) 関数を使ってファイルの終わりに達したかを確認しながらループ処理を行うのが一般的です。

例: 保存されたユーザー名とスコアを読み込む

先ほど保存した “savedata.txt” から名前とスコアを読み込んで表示するプログラムです。

' 変数の宣言
DIM loaded_username AS STRING
DIM loaded_score AS INTEGER

' ファイルを開く (読み込みモード)
' 注意: ファイルが存在しないとエラーになる可能性があります
OPEN "savedata.txt" FOR INPUT AS #1

' ファイルからデータを読み込む (保存した順番と型に合わせて読み込む)
INPUT #1, loaded_username
INPUT #1, loaded_score

' ファイルを閉じる
CLOSE #1

' 読み込んだデータを表示する
PRINT "ファイルから読み込んだデータ:"
PRINT "名前: "; loaded_username
PRINT "スコア: "; loaded_score
PRINT "読み込み完了!✅"

このプログラムを実行すると、”savedata.txt” の内容が読み込まれ、画面に表示されます。

注意: INPUT # で読み込む際には、ファイルに保存されているデータの型 (文字列か数値か) と、プログラム側で受け取る変数の型を一致させる必要があります。また、保存したデータの順番通りに読み込む必要があります。

応用: 配列データの保存と読み込み

配列のデータを保存・読み込みしたい場合も基本的な考え方は同じです。配列の各要素をループ処理で一つずつファイルに書き込み、読み込む際もループで一つずつ読み込んで配列に格納します。

例えば、ハイスコアランキングを配列で管理している場合、FOR...NEXT ループを使って配列の全要素をファイルに書き出し、読み込み時も同様にループでファイルから読み込んで配列を復元します。

DIM highscores(1 TO 5) AS INTEGER
DIM i AS INTEGER

' (例: highscores 配列に何らかのスコアが入っているとする)
' highscores(1) = 1000
' highscores(2) = 850
' ...

' 配列データをファイルに保存
OPEN "highscores.dat" FOR OUTPUT AS #1
FOR i = 1 TO 5
  PRINT #1, highscores(i)
NEXT i
CLOSE #1
PRINT "ハイスコアを保存しました。"

' --- 別の機会に ---

' 配列データをファイルから読み込み
OPEN "highscores.dat" FOR INPUT AS #1
FOR i = 1 TO 5
  ' ファイルの終端チェックを入れるとより安全
  IF EOF(1) THEN EXIT FOR
  INPUT #1, highscores(i)
NEXT i
CLOSE #1
PRINT "ハイスコアを読み込みました。"

' 読み込んだハイスコアを表示
PRINT "--- ハイスコア ---"
FOR i = 1 TO 5
  PRINT i; ": "; highscores(i)
NEXT i

まとめ

今回は、BASICでデータをファイルに永続的に保存し、それを読み込む方法を学びました。

コマンド/モード 主な用途 注意点
OPEN "ファイル名" FOR OUTPUT AS #番号 新規ファイルへの書き込み (上書き) ファイルが存在すると中身が消える。
OPEN "ファイル名" FOR APPEND AS #番号 既存ファイルへの追記 ファイルが存在しない場合は新規作成される。
OPEN "ファイル名" FOR INPUT AS #番号 ファイルからの読み込み ファイルが存在しないとエラーになる場合がある。
PRINT #番号, データ ファイルへのデータ書き込み カンマや改行で区切り方を工夫する。
INPUT #番号, 変数 ファイルからのデータ読み込み 書き込んだデータの型や順番に合わせて読み込む。
CLOSE #番号 ファイルを閉じる ファイル操作後は必ず実行する。
EOF(番号) ファイルの終端チェック INPUT # と組み合わせてループで使う。

これらのファイル操作をマスターすれば、ゲームのセーブデータ、設定情報、集計結果など、様々なデータをプログラム間でやり取りできるようになり、作れるプログラムの幅がぐっと広がります! 🎉

次のステップ「Step 7: グラフィックと音」では、いよいよ画面に図形を描いたり、音を出したりする方法を学びます。お楽しみに!🎨🎵

コメント

タイトルとURLをコピーしました