# File Handling

> Cambridge Assessment International Education (CAIE) Pseudocode Reference Guide
> Applicable Syllabus: **IGCSE &amp; A Level**

Cambridge IGCSE and AS &amp; A Level sequential text files (OPENFILE, READFILE, WRITEFILE, EOF), with 9618 random-access extensions.

---

Files must be opened before use with `OPENFILE` and closed with `CLOSEFILE`. Sequential text files are covered by IGCSE and AS &amp; A Level. Random-access records are an AS &amp; A Level extension.

### 9.1 Text Files

| Command | Description |
|---------|-------------|
| `OPENFILE &lt;file&gt; FOR READ` | Open for reading lines sequentially |
| `OPENFILE &lt;file&gt; FOR WRITE` | Create or truncate file for writing |
| `OPENFILE &lt;file&gt; FOR APPEND` | Open to append data after existing contents |
| `READFILE &lt;file&gt;, &lt;var&gt;` | Read next line into a STRING variable |
| `WRITEFILE &lt;file&gt;, &lt;data&gt;` | Write data as a new line to the file |
| `EOF(&lt;file&gt;)` | Returns TRUE if no more lines remain to be read |
| `CLOSEFILE &lt;file&gt;` | Close and flush the file |

### Text File Example — Copy with Replacement

```pseudocode
// runnable
// Text file copy demo
// Create sample input in the sandbox virtual filesystem
OPENFILE &quot;FileA.txt&quot; FOR WRITE
WRITEFILE &quot;FileA.txt&quot;, &quot;First line&quot;
WRITEFILE &quot;FileA.txt&quot;, &quot;&quot;
CLOSEFILE &quot;FileA.txt&quot;
DECLARE LineOfText : STRING
OPENFILE &quot;FileA.txt&quot; FOR READ
OPENFILE &quot;FileB.txt&quot; FOR WRITE
WHILE NOT EOF(&quot;FileA.txt&quot;)
   READFILE &quot;FileA.txt&quot;, LineOfText
   IF LineOfText = &quot;&quot; THEN
      WRITEFILE &quot;FileB.txt&quot;, &quot;----------------------------&quot;
   ELSE
      WRITEFILE &quot;FileB.txt&quot;, LineOfText
   ENDIF
ENDWHILE
CLOSEFILE &quot;FileA.txt&quot;
CLOSEFILE &quot;FileB.txt&quot;
```

### 9.2 Random Files (9618)

| Command | Description |
|---------|-------------|
| `OPENFILE &lt;file&gt; FOR RANDOM` | Open for direct record address access |
| `SEEK &lt;file&gt;, &lt;address&gt;` | Move file pointer to target record number |
| `GETRECORD &lt;file&gt;, &lt;var&gt;` | Read record structure at active file pointer |
| `PUTRECORD &lt;file&gt;, &lt;var&gt;` | Write record structure at active file pointer |

### Random File Example

This fragment assumes the record type and an existing data file have already been created.

```pseudocode
DECLARE Pupil : StudentRecord
DECLARE NewPupil : StudentRecord

NewPupil.LastName &lt;- &quot;Johnson&quot;
NewPupil.FirstName &lt;- &quot;Leroy&quot;
NewPupil.YearGroup &lt;- 6

OPENFILE &quot;StudentFile.Dat&quot; FOR RANDOM
FOR Position &lt;- 20 TO 10 STEP -1
   SEEK &quot;StudentFile.Dat&quot;, Position
   GETRECORD &quot;StudentFile.Dat&quot;, Pupil
   SEEK &quot;StudentFile.Dat&quot;, Position + 1
   PUTRECORD &quot;StudentFile.Dat&quot;, Pupil
NEXT Position

SEEK &quot;StudentFile.Dat&quot;, 10
PUTRECORD &quot;StudentFile.Dat&quot;, NewPupil
CLOSEFILE &quot;StudentFile.Dat&quot;
```


---

* Previous Topic: [Procedures &amp; Functions](https://csmasters.dev/docs/pseudocode/subroutines.md)
* Next Topic: [Object-Oriented Programming](https://csmasters.dev/docs/pseudocode/oop.md)
