| English | 意味 |
|---|---|
| file/faɪl/ | ファイル |
| text file/tekst faɪl/ | テキストファイル |
| secondary storage/ˈsekəndəri ˈstɔːrɪdʒ/ | 補助記憶装置 |
| persistence/pəˈsɪstəns/ | 永続性 |
| end of file/end ɒv faɪl/ | ファイル終端 |
| separator/ˈsepəreɪtə/ | 区切り文字 |
| sequential/siːˈkwenʃl/ | 順次 |
記憶に残ったゲーム
- 1987年まで、ゲームコンソールをオフにするとすべて消去された。セッションは毎回最初の画面から始まり、長いゲームは長い午後のことか、何もしなかったことだった。
- The Legend of Zelda はカートリッジ内に小型バッテリーを搭載しており、数百バイトのデータを維持していた。初めてホームゲームで save が可能になり、中断した場所から再開できた。
- 高得点、文書、設定など、これまで保存してきたものはすべて同じ理由がある:RAM は電源オフで忘れるが、ファイル は忘れない。
- このLessonがファイルが存在する理由と、擬似コードがテキストファイルを各行为单位で読み書きする方法を示している。
ファイルが必要な理由
- 変数は RAM にあり、プログラム終了とともに消失する。セカンダリーストレージ上の ファイル は、プログラム実行間隔でデータを保持する:persistence。
- ファイルにより、あるプログラムの出力が別のプログラムの入力となり、データを shared できる。
- ファイルは memory に収まらないほど多くのデータを持て、プログラムは保存された状態から restart できる。

実行结束时变量消失;文件明天依然存在
Why does a program write data to a file rather than keeping it in a variable?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
RAM is volatile, so data is lost on exit. A file on secondary storage persists between runs.
テキストファイルと3つのモード
- テキストファイル は文字のラインとしてデータを保存し、プログラムは先頭から1行単位で読み書きする。このラインの並び順がループで処理を可能にする。
OPENFILE … FOR READは先頭ラインから読み込む。FOR WRITEは新しいファイルを作成するか、既存のものを overwrites する。FOR APPENDは end に新しいラインを追加し、既存の内容を維持する。- 使用前に open、使用后に close。ファイルは一度に1つの mode しか持たない。
Match each file-open mode to what it does.
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
READ reads; WRITE replaces from scratch; APPEND adds to the end without losing what is there.
To add lines to the end of an existing file without losing its contents, open it FOR ____.
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
WRITE would start the file empty. APPEND keeps what is there and writes after it.
全ラインの読み取り
OPENFILE "data.txt" FOR READ
WHILE NOT EOF("data.txt") DO
READFILE "data.txt", LineString
OUTPUT LineString
ENDWHILE
CLOSEFILE "data.txt"
EOFは end of file をテストする。読み出しの before にテストする:end を超えて読み出すとエラーになる。CLOSEFILEが重要:buffered データが失われたり、open のまま残されたファイルに他のプログラムがアクセスできなくなったりする。
Handling a file: open → use → close
Step through the lifecycle every file follows. The two easy-to-forget parts are testing EOF while reading in a loop, and always closing at the end.
What does EOF test for?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
EOF (end of file) is checked before each read so the loop stops when there is no more data.
Why must you always close a file after using it?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
Closing flushes buffered writes to disk and releases the lock so other programs can use the file.
ラインの書き込み
OPENFILE "log.txt" FOR WRITE
FOR i ← 1 TO 100
WRITEFILE "log.txt", "Event " & NUM_TO_STR(i)
NEXT i
CLOSEFILE "log.txt"
WRITEはファイルを空から始める。履歴を残すログに追加するには、代わりにFOR APPENDで open する。- テキストファイルは strings を保持する:出力時は
NUM_TO_STRで変換される数字。
演習例:ファイルの最終3ライン
- 手順
LastLines(FileName)を記述して、テキストファイルの最終3ラインを順に出力せよ。
PROCEDURE LastLines(BYVAL FileName : STRING)
DECLARE LineX, LineY, LineZ : STRING
LineX ← ""
LineY ← ""
LineZ ← ""
OPENFILE FileName FOR READ
WHILE NOT EOF(FileName) DO
LineX ← LineY
LineY ← LineZ
READFILE FileName, LineZ
ENDWHILE
CLOSEFILE FileName
OUTPUT LineX
OUTPUT LineY
OUTPUT LineZ
ENDPROCEDURE
- 各新しいラインが previous lines を押し出すため、
EOFで3つの変数が最終3ラインを持つ;短いファイルは空の文字列を出力する。first 5ラインの場合、read のカウントを行い、5 orEOFのどちらか先に到達したら停止する。空のファイルは open 直後にEOFが true になる。
Put the steps of the LastLines procedure in order.
難易度 3/5 · 200 コイン + 今日初回完了時に小ボーナス付与
Initialise, open, loop with the shift before the read, close, output. Shifting after the read would lose the newest line.
ライン内のフィールド
- レコードは one line で書かれ、separator 文字で fields が結合され、各数値や Boolean は
NUM_TO_STRで変換され(STR_TO_NUMで読み返す、または"TRUE"と比較する)。 - データに絶対に現れない区切り文字を選ぶ:名前や数値にはコンマや
|を使用;名前にスペースが含まれる可能性がある場合、スペースは使わない。 - 読み戻し:行を読み込み、区切り文字で分割し、各フィールドを対応する型に変換してレコードに格納する。

書き出しは区切り文字で結合し、読み戻しは分割して変換する
A line stores a player's full name and score. Which separator is the safest choice?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
The separator must never occur inside a field. A full name contains a space, and a score contains digits.
An INTEGER can be written to a text file directly, without converting it to a string first.
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
A text file holds lines of characters. Convert with NUM_TO_STR to write and STR_TO_NUM to read back.
worked example: レコードを保存して読み戻す
- このレコード
Playerは、フィールドName : STRINGとScore : INTEGERを持つ。それをscores.txtに1行として追加する擬似コードと、1行を読み戻してレコードに格納する擬似コードを記述せよ。
OPENFILE "scores.txt" FOR APPEND
WRITEFILE "scores.txt", Player.Name & "," & NUM_TO_STR(Player.Score)
CLOSEFILE "scores.txt"
OPENFILE "scores.txt" FOR READ
READFILE "scores.txt", Line
Pos ← POSITION(Line, ",")
Player.Name ← LEFT(Line, Pos - 1)
Player.Score ← STR_TO_NUM(MID(Line, Pos + 1, LENGTH(Line) - Pos))
CLOSEFILE "scores.txt"
- 採点基準:適切なモード、数値の変換(両方向)、名前に出現しない区切り文字、そして両方のファイルを閉じること。
To store a record as one line of a text file, a program must: select all that apply.
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
Convert, join, write, close. A text file has no binary layout; that is what a binary file would do.
シリアルアクセスとダイレクトアクセス
- テキストファイルはシリアル(順次)アクセスである:先頭から順に読み込まれるため、ある行を見つけるにはその前のすべての行を読む必要がある。
- ダイレクト(ランダム)アクセスは計算された位置に直接ジャンプしてレコードを取得し、他のレコードを読む必要がない。ただし、固定長レコードが必要であり、テキストファイルはこれを持たない。
- シラバスでは、上記のテキストファイルループがモデルとなる:開く、
EOFのテストを行う、読む、閉じる。
Direct (random) access lets a program jump straight to a record without reading the others first.
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
Serial access must read from the start.
見落としやすいポイント
- 末尾を超えて読む。
EOFをREADFILEの前にテストする。 - ファイルの内容を保持する必要がある場合に
FOR WRITEで開くこと。これはAPPENDである。 NUM_TO_STRなく書き込み、STR_TO_NUMなく読み出す。テキストファイルは文字列を持つ。CLOSEFILEを忘れる、またはOPENFILEbefore ファイルを使う。どちらもファイル操作に関する得点を失う。
理解できましたか
- ファイルは永続性を提供する:データはプログラムの終了後も残り続け、共有でき、メモリ容量を超えることもできる。
OPENFILE … FOR READ | WRITE | APPEND→READFILE/WRITEFILE→CLOSEFILE;WRITEは上書き、APPENDは末尾に追加- 各読み戻しの前に
EOFをテスト;数値はNUM_TO_STRで変換して書き出し、STR_TO_NUMで変換して読み戻す - 1レコード=1行、フィールドはデータに絶対に現れない区切り文字で結合