basic2c/test_fileio.bas
2026-02-21 18:51:40 -06:00

190 lines
4.3 KiB
QBasic

' ============================================================
' Test program for File I/O features
' OPEN, CLOSE, PRINT #, INPUT #, LINE INPUT #, WRITE #,
' EOF(), LOF(), FREEFILE()
' ============================================================
PRINT "==== File I/O Tests ===="
' ---- Test 1: Basic OPEN/PRINT #/CLOSE (write a file) ----
PRINT ""
PRINT "---- Test 1: Write file with PRINT # ----"
OPEN "/tmp/basic_test1.txt" FOR OUTPUT AS #1
PRINT #1, "Hello, File World!"
PRINT #1, "Line two"
PRINT #1, "Line three"
CLOSE #1
PRINT "Wrote 3 lines to /tmp/basic_test1.txt"
' ---- Test 2: Read file back with LINE INPUT # ----
PRINT ""
PRINT "---- Test 2: Read file with LINE INPUT # ----"
DIM line$ AS STRING
OPEN "/tmp/basic_test1.txt" FOR INPUT AS #1
DIM lineCount AS INTEGER
lineCount = 0
DO WHILE NOT EOF(1)
LINE INPUT #1, line$
lineCount = lineCount + 1
PRINT "Line "; lineCount; ": "; line$
LOOP
CLOSE #1
PRINT "Read "; lineCount; " lines"
' ---- Test 3: FREEFILE ----
PRINT ""
PRINT "---- Test 3: FREEFILE ----"
DIM f AS INTEGER
f = FREEFILE()
PRINT "First free file number: "; f
OPEN "/tmp/basic_test2.txt" FOR OUTPUT AS #f
PRINT #f, "Written using FREEFILE"
CLOSE #f
PRINT "Wrote using file #"; f
' Read it back to verify
OPEN "/tmp/basic_test2.txt" FOR INPUT AS #1
LINE INPUT #1, line$
CLOSE #1
PRINT "Read back: "; line$
' ---- Test 4: Numeric data with PRINT # and INPUT # ----
PRINT ""
PRINT "---- Test 4: Numeric I/O ----"
DIM x AS DOUBLE
DIM y AS DOUBLE
DIM n AS INTEGER
x = 3.14159
y = 2.71828
n = 42
OPEN "/tmp/basic_test3.txt" FOR OUTPUT AS #1
PRINT #1, x
PRINT #1, y
PRINT #1, n
CLOSE #1
DIM rx AS DOUBLE
DIM ry AS DOUBLE
DIM rn AS INTEGER
OPEN "/tmp/basic_test3.txt" FOR INPUT AS #1
INPUT #1, rx
INPUT #1, ry
INPUT #1, rn
CLOSE #1
PRINT "Read x = "; rx
PRINT "Read y = "; ry
PRINT "Read n = "; rn
' ---- Test 5: WRITE # (CSV-style output) ----
PRINT ""
PRINT "---- Test 5: WRITE # (CSV) ----"
DIM name$ AS STRING
DIM age AS INTEGER
DIM score AS DOUBLE
name$ = "Alice"
age = 30
score = 95.5
OPEN "/tmp/basic_test4.csv" FOR OUTPUT AS #1
WRITE #1, name$, age, score
name$ = "Bob"
age = 25
score = 88.3
WRITE #1, name$, age, score
CLOSE #1
' Read back and display
OPEN "/tmp/basic_test4.csv" FOR INPUT AS #1
DO WHILE NOT EOF(1)
LINE INPUT #1, line$
PRINT "CSV: "; line$
LOOP
CLOSE #1
' ---- Test 6: LOF (file length) ----
PRINT ""
PRINT "---- Test 6: LOF ----"
OPEN "/tmp/basic_test1.txt" FOR INPUT AS #1
DIM fsize AS LONG
fsize = LOF(1)
PRINT "File size of test1.txt: "; fsize; " bytes"
CLOSE #1
' ---- Test 7: APPEND mode ----
PRINT ""
PRINT "---- Test 7: APPEND mode ----"
OPEN "/tmp/basic_test1.txt" FOR APPEND AS #1
PRINT #1, "Appended line four"
PRINT #1, "Appended line five"
CLOSE #1
' Read all lines back
OPEN "/tmp/basic_test1.txt" FOR INPUT AS #1
lineCount = 0
DO WHILE NOT EOF(1)
LINE INPUT #1, line$
lineCount = lineCount + 1
PRINT "Line "; lineCount; ": "; line$
LOOP
CLOSE #1
PRINT "Total lines after append: "; lineCount
' ---- Test 8: PRINT # with semicolons (no newline) ----
PRINT ""
PRINT "---- Test 8: PRINT # with separators ----"
OPEN "/tmp/basic_test5.txt" FOR OUTPUT AS #1
PRINT #1, "A"; "B"; "C"
PRINT #1, 10; " "; 20; " "; 30
CLOSE #1
OPEN "/tmp/basic_test5.txt" FOR INPUT AS #1
DO WHILE NOT EOF(1)
LINE INPUT #1, line$
PRINT " "; line$
LOOP
CLOSE #1
' ---- Test 9: Multiple files open simultaneously ----
PRINT ""
PRINT "---- Test 9: Multiple files ----"
OPEN "/tmp/basic_multi1.txt" FOR OUTPUT AS #1
OPEN "/tmp/basic_multi2.txt" FOR OUTPUT AS #2
PRINT #1, "File one content"
PRINT #2, "File two content"
CLOSE #2
CLOSE #1
OPEN "/tmp/basic_multi1.txt" FOR INPUT AS #1
LINE INPUT #1, line$
PRINT "File 1: "; line$
CLOSE #1
OPEN "/tmp/basic_multi2.txt" FOR INPUT AS #2
LINE INPUT #2, line$
PRINT "File 2: "; line$
CLOSE #2
' ---- Test 10: File I/O in a FUNCTION ----
PRINT ""
PRINT "---- Test 10: File I/O in FUNCTION ----"
FUNCTION CountLines(BYVAL fname AS STRING) AS INTEGER
LOCAL count AS INTEGER
LOCAL buf$ AS STRING
count = 0
OPEN fname FOR INPUT AS #3
DO WHILE NOT EOF(3)
LINE INPUT #3, buf$
count = count + 1
LOOP
CLOSE #3
CountLines = count
END FUNCTION
DIM cnt AS INTEGER
cnt = CountLines("/tmp/basic_test1.txt")
PRINT "CountLines result: "; cnt
PRINT ""
PRINT "==== ALL FILE I/O TESTS COMPLETE ===="