[BASICのはじめ方] Part16: ファイルの読み書き(OPEN, INPUT#, PRINT#, CLOSE)

BASIC

はじめに:なぜファイル操作が必要なの?🤔

これまでのステップでは、プログラムを実行するたびに変数に入れたデータは消えてしまいましたね。プログラムを終了してもデータを保存しておき、後でまた読み込めたら便利だと思いませんか?

例えば、ゲームのハイスコアを記録したり、住所録を作成したりする場合、データをファイルに保存する必要があります。BASICでは、OPEN, PRINT#, INPUT#, CLOSE といった命令を使って、ファイルの読み書き(ファイル操作)を行うことができます。

このステップでは、これらの基本的なファイル操作命令の使い方を学び、プログラムでデータを永続的に扱えるようにしましょう!💪

1. ファイルを開く: OPEN 📂

ファイルにデータを書き込んだり、ファイルからデータを読み込んだりする前に、まずファイルを「開く」必要があります。ファイルを開くには OPEN 命令を使います。

OPEN 命令は、どのファイルを、何のために(書き込み、読み込み、追記)、どの番号で扱うかを指定します。

構文

OPEN "ファイル名" FOR モード AS #ファイル番号
  • ファイル名: 操作したいファイルの名前を文字列で指定します。”data.txt” や “C:\TEMP\score.dat” のように、パスを含めることもできます。
  • モード: ファイルをどのように開くかを指定します。主なモードは以下の通りです。
    モード説明
    OUTPUT書き込み用。ファイルが存在しない場合は新規作成し、存在する場合は内容を上書きします。📝
    INPUT読み込み用。ファイルが存在しないとエラーになります。📖
    APPEND追記用。ファイルが存在しない場合は新規作成し、存在する場合はファイルの末尾にデータを追加します。✍️
    ⚠️ OUTPUT モードは既存のファイルを上書きしてしまうので、注意して使いましょう。
  • ファイル番号: 開いたファイルを識別するための番号(通常は1以上の整数)を指定します。#1, #2 のように、シャープ記号(#)を付けて指定します。この番号は、後で PRINT#INPUT#, CLOSE でファイルを参照する際に使います。

' "mydat.txt" というファイルを書き込み用(OUTPUT)としてファイル番号1で開く
OPEN "mydat.txt" FOR OUTPUT AS #1

' "score.log" というファイルを追記用(APPEND)としてファイル番号2で開く
OPEN "score.log" FOR APPEND AS #2

' "config.dat" というファイルを読み込み用(INPUT)としてファイル番号3で開く
OPEN "config.dat" FOR INPUT AS #3

2. ファイルに書き込む: PRINT# 📝

OUTPUT または APPEND モードで開いたファイルにデータを書き込むには、PRINT# 命令を使います。画面に表示する PRINT 命令と似ていますが、ファイル番号を指定する点が異なります。

構文

PRINT #ファイル番号, データ1 [, データ2] ...
  • ファイル番号: OPEN 命令で指定したファイル番号を指定します。
  • データ: ファイルに書き込みたい変数や定数(数値、文字列)を指定します。カンマ(,)やセミコロン(;)で区切ることで、複数のデータを書き込めます。通常、PRINT# は最後に改行を書き込みます。

DIM Name$ AS STRING
DIM Score AS INTEGER

Name$ = "Alice"
Score = 100

' ファイルを書き込み用に開く
OPEN "player.txt" FOR OUTPUT AS #1

' ファイルにデータを書き込む
PRINT #1, Name$
PRINT #1, Score
PRINT #1, "Bob", 250 ' 複数のデータを書き込む

' 書き込みが終わったらファイルを閉じる(後述)
CLOSE #1

上記の例を実行すると、”player.txt” というファイルが作成され、以下のような内容が書き込まれます。

Alice
100
Bob           250

(注意:カンマ区切りで PRINT# した場合のスペースの入り方は、BASICの方言によって異なる場合があります。)

データをカンマ区切りで保存したい場合は、以下のように明示的にカンマを書き込むことが多いです。

DIM Name$ AS STRING
DIM Score AS INTEGER

Name$ = "Alice"
Score = 100

OPEN "player_csv.txt" FOR OUTPUT AS #1

' カンマ区切りで書き込む
PRINT #1, Name$; ","; Score

Name$ = "Bob"
Score = 250
PRINT #1, Name$; ","; Score

CLOSE #1

この場合、”player_csv.txt” の内容は以下のようになります。

Alice,100
Bob,250

3. ファイルから読み込む: INPUT# 📖

INPUT モードで開いたファイルからデータを読み込むには、INPUT# 命令を使います。キーボードから入力する INPUT 命令と似ていますが、ファイル番号を指定してファイルからデータを読み込み、変数に格納します。

構文

INPUT #ファイル番号, 変数1 [, 変数2] ...
  • ファイル番号: OPEN 命令で指定したファイル番号を指定します。
  • 変数: ファイルから読み込んだデータを格納する変数を指定します。ファイル内のデータと変数の型(数値、文字列)が一致している必要があります。カンマ区切りで複数の変数を指定すると、ファイルから対応するデータを読み込もうとします。

先ほど作成した “player_csv.txt” (内容は Alice,100Bob,250) からデータを読み込んでみましょう。

DIM PlayerName$ AS STRING
DIM PlayerScore AS INTEGER

' ファイルを読み込み用に開く
OPEN "player_csv.txt" FOR INPUT AS #1

' 1行目(1人目のデータ)を読み込む
INPUT #1, PlayerName$, PlayerScore
PRINT "Name: "; PlayerName$, "Score:"; PlayerScore

' 2行目(2人目のデータ)を読み込む
INPUT #1, PlayerName$, PlayerScore
PRINT "Name: "; PlayerName$, "Score:"; PlayerScore

' 読み込みが終わったらファイルを閉じる(後述)
CLOSE #1

これを実行すると、画面には次のように表示されるはずです。

Name: Alice       Score: 100
Name: Bob         Score: 250
💡 ファイルの終わりまで読み込んだ後にさらに INPUT# しようとするとエラーになることがあります。ファイルの終わりを検出する方法(EOF 関数など)については、より高度なトピックで扱います。

4. ファイルを閉じる: CLOSE ✅

ファイルを開いて操作(書き込みや読み込み)が終わったら、必ずファイルを「閉じる」必要があります。ファイルを閉じるには CLOSE 命令を使います。

構文

CLOSE #ファイル番号

または、開いているすべてのファイルを閉じる場合は、ファイル番号を省略します。

CLOSE

なぜ閉じる必要があるの?

  • データの保存: 特に書き込みモード(OUTPUT, APPEND)の場合、CLOSE しないと、書き込んだデータの一部または全部がファイルに正しく保存されない可能性があります。OSは効率化のためにデータを一時的にメモリに溜めてからファイルに書き込むことがあるため、CLOSE 命令で確実にファイルへの書き込みを完了させる必要があります。
  • リソースの解放: 開いているファイルは、プログラムやOSのリソースを使用します。CLOSE することで、これらのリソース(ファイル番号など)が解放され、他のファイル操作で再利用できるようになります。
  • 他のプログラムからのアクセス: ファイルを開きっぱなしにしていると、他のプログラムがそのファイルにアクセスできなくなることがあります。
🔥 重要: ファイル操作が終わったら、必ず CLOSE 命令でファイルを閉じる習慣をつけましょう!

' ファイル番号1を開く
OPEN "data1.txt" FOR OUTPUT AS #1
PRINT #1, "これはファイル1です。"
' ... 他の処理 ...
CLOSE #1 ' ファイル番号1を閉じる

' ファイル番号2と3を開く
OPEN "data2.txt" FOR INPUT AS #2
OPEN "temp.tmp" FOR OUTPUT AS #3
' ... 読み書き処理 ...
CLOSE #2 ' ファイル番号2を閉じる
CLOSE #3 ' ファイル番号3を閉じる

' または、まとめて閉じる
OPEN "log.txt" FOR APPEND AS #1
OPEN "config.ini" FOR INPUT AS #2
' ... 処理 ...
CLOSE ' 開いているすべてのファイル(#1, #2)を閉じる

まとめ:書き込みと読み込みの例 🔄

最後に、ファイルにデータを書き込み、それを再度読み込んで表示する一連の流れを見てみましょう。

CLS ' 画面をクリア

DIM UserName$ AS STRING
DIM UserAge AS INTEGER

' --- ファイルへの書き込み ---
PRINT "ファイルに保存するデータを入力してください。"
INPUT "名前: ", UserName$
INPUT "年齢: ", UserAge

PRINT "データを profile.txt に書き込みます..."

' 書き込み用にファイルを開く
OPEN "profile.txt" FOR OUTPUT AS #1

' データを書き込む (カンマ区切りで)
PRINT #1, UserName$; ","; UserAge

' ファイルを閉じる (これでデータが保存される)
CLOSE #1

PRINT "書き込み完了!"
PRINT

' --- ファイルからの読み込み ---
PRINT "profile.txt からデータを読み込みます..."

DIM ReadName$ AS STRING
DIM ReadAge AS INTEGER

' 読み込み用にファイルを開く
OPEN "profile.txt" FOR INPUT AS #1

' データを読み込む
INPUT #1, ReadName$, ReadAge

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

PRINT "読み込み完了!"
PRINT "読み込んだデータ:"
PRINT "名前: "; ReadName$
PRINT "年齢: "; ReadAge

END

このプログラムを実行すると、まず名前と年齢を入力するよう求められます。入力されたデータは “profile.txt” というファイルにカンマ区切りで保存されます。その後、プログラムは同じファイルを開き、保存されたデータを読み込んで画面に表示します。

これで、プログラムを終了してもデータがファイルに残り、次回実行時などに利用できるようになりましたね! 🎉

次のステップへ

今回は、基本的なファイルの読み書き方法を学びました。次の「データの保存と読み込み」では、これらの命令を応用して、複数のデータを効率的に扱ったり、エラー処理について考えたりする方法を見ていきます。

ファイル操作ができるようになると、作れるプログラムの幅がぐっと広がります。ぜひ、いろいろ試してみてくださいね!

コメント

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