From QB64 Wiki
Revision as of 00:43, 13 November 2011 by imported>Clippy
Jump to navigation Jump to search

The OPEN statement is used to open a file or COM (serial port).


Qbasic == Syntax == OPEN FileName$ [FOR mode] AS [#]FileNumber% [ACCESS{READ|WRITE}][LOCK][LEN = recordLEN]
GWBasic == Syntax == OPEN modeletter$, [#]filenumber, filename$[, recordLEN]

  • FileName$ is a STRING variable or literal file name inside of quotes.
  • Illegal Qbasic filename characters are " * / \ + | ? [ ] , ; : < > and more than one dot(period).
  • Illegal QB64 filename characters are " * / \ | ? : < > . Multiple dots(periods) are allowed, but only the first one will be used.
  • Qbasic filenames must not exceed 12 characters(including dot) with a maximum of 3 file type extension characters using the DOS 8.3 naming convention limits.
  • QB64 filenames can be up to 255(Windows) characters with no limit on extension length.
  • File number can be any INTEGER value from 1 to 255 or an unused value determined by FREEFILE.
  • The mode defaults to RANDOM if the mode or FOR access statement is omitted. (see open modes below)
  • LEN = is optional. Sequencial files default to 512 and RANDOM to 128 bytes. Statement ignored in BINARY mode.
  • Once a file or port is opened, it can be used in any program procedure using the assigned file number.
  • Possible OPEN errors include "Bad file name or number", "Bad File Mode", "File Not Found" or "Path Not Found".
  • Devices such as "KYBD:", "SCRN:", "CONS:" and "LPTn:" are currently NOT supported in QB64!.
Note: OPEN LPTn is not supported by QB64, but may be supported directly by your operating system.
  • OPEN COM is implemented for serial port access!

File Access Permissions
  • ACCESS and LOCK clauses require that the DOS SHARED.EXE program be run for QBasic to use networking access.
  • ACCESS clause limits file access to READ WRITE, WRITE or READ on a network ONLY with DOS 3.1 or greater.
  • LOCK clause can specify a READ or WRITE file lock in an OPEN statement working on a network.
  • A separate LOCK statement can lock or UNLOCK file access on a network ONLY using the same READ WRITE permissions as designated in the OPEN ACCESS clause.

Qbasic File Modes: Open can use 5 different access modes:
  • OUTPUT: Creates a new file or erases an existing file for new program output. Use WRITE # to write data or the PRINT # for text. OUTPUT clears the receive buffer on devices. Sequencial mode.
  • APPEND: Creates a new file or appends program output to existing file. Use WRITE # or PRINT # as in the OUTPUT mode. Sequencial mode.
  • BINARY: Creates a new file or uses input and/or output from existing file. Use GET # to read or PUT # to write simultaneously. LEN = statements are ignored.
  • RANDOM: Creates a new file or uses input and/or output from existing file. Use GET # or PUT # the same as BINARY mode. A LEN = statement can define the byte size of a record(defaut = 128).
  • INPUT : Sequencial mode only reads input from an existing file. File error if file does not exist! Use _FILEEXISTS and _DIREXISTS to avoid errors. Use INPUT # for numerical or text data and LINE INPUT # or INPUT$ to only read text data.
  • The INPUT, BINARY and RANDOM file modes allow a file to be concurrently opened in a different mode and number.

GWbasic File Modes: STRING value or variable supported in Qbasic

  • "O" denotes OUTPUT mode as defined above.
  • "A" denotes APPEND mode as defined above.
  • "B" denotes BINARY mode as defined above.
  • "R" denotes RANDOM mode as defined above.
  • "I" denotes INPUT mode as defined above.

  • This type of OPEN allows the statement to be made using program variables only. A holdover for compatibility with GW Basic.
  • Record length is only used when opening Random Files("R"). Use multiples of 128 only.
  • Does not support any file ACCESS or LOCK restrictions.

Comparing the GWBasic OPEN to a Qbasic OPEN statement:

GWBasic: OPEN "A", #1, Filename$
Qbasic: OPEN Filename$ FOR APPEND AS #1
Where Filename$ is the filename variable or a literal string name such as "Data1.DAT" is used. The Qbasic syntax cannot use a variable to change the OPEN mode so the programmer must determine it ahead of time.

Example 1: Function that displays errors and the number of errors in Qbasic filenames. Returns 0 when filename is OK.

file$ = "Hello,~1.mp3" 'example call below LOCATE 20, 30: errors% = CheckName%(file$): COLOR 14: PRINT " Total Errors ="; errors% FUNCTION CheckName% (Filename$) 'NOTE: Function also displays filename errors so LOCATE on screen before call! DIM L AS INTEGER, DP AS INTEGER, XL AS INTEGER L = LEN(Filename$): DP = INSTR(Filename$, "."): IF DP THEN XL = L - DP 'extension IF L = 0 OR L > 12 OR DP > 9 OR XL > 3 THEN CheckName% = -1: COLOR 12: PRINT "Illegal format!"; : EXIT FUNCTION END IF FOR i% = 1 TO L 'check each filename character" code% = ASC(MID$(Filename$, i%, 1)): COLOR 10 ' see ASCII codes SELECT CASE code% 'check for errors and highlight in red CASE 34, 42 TO 44, 47, 58 TO 63, 91 TO 93, 124: E% = E% + 1: COLOR 12 ' Qbasic errors 'CASE 34, 42, 47, 58, 60, 62, 92, 124: E% = E% + 1: COLOR 12 ' QB64 errors CASE 46: dot% = dot% + 1: IF dot% > 1 THEN E% = E% + 1: COLOR 12 END SELECT PRINT CHR$(code%); 'use LOCATE before FUNCTION call to place print NEXT CheckName% = E% END FUNCTION

Note: The QB64 character list is commented out. Comment out the Qbasic one if using QB64 list.

Hello,~1.mp3 Total Errors = 1

Note: The screen output displays filename characters in green except for red comma Qbasic error.

Example 2: A function that verifies that a file exists if it is NOT empty. Note: May create a file that is deleted if empty.

INPUT "Enter a file name: ", file$ IF Exist%(file$) THEN OPEN file$ FOR INPUT AS #1: found% = -1 'function call demo CLOSE #1 IF found% THEN PRINT "File exists!" ELSE PRINT "File not found!" END FUNCTION Exist% (filename$) f% = FREEFILE OPEN filename$ FOR APPEND AS #f% IF LOF(f%) THEN Exist% = -1 ELSE Exist% = 0: CLOSE #f%: KILL filename$ CLOSE #f% END FUNCTION

Code by Ted Weissgerber

See also:

Go to Keyword Reference - Alphabetical
Go to Keyword Reference - By usage
Go to Main WIKI Page