OPEN: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
 
(7 intermediate revisions by the same user not shown)
Line 3: Line 3:


{{PageSyntax}}
{{PageSyntax}}
: [[OPEN]] {{Parameter|fileName$}} ['''FOR''' {{Parameter|mode}}] [{{{KW|ACCESS}}|{{{KW|LOCK}}|SHARED}} [{READ|WRITE}] [[AS]] [#]{{Parameter|fileNumber&}} [LEN = {{Parameter|recordLength}}]
: [[OPEN]] {{Parameter|fileName$}} ['''FOR''' {{Parameter|mode}}] [{[[ACCESS]]|{[[LOCK]]|SHARED}} [{READ|WRITE}] [[AS]] [#]{{Parameter|fileNumber&}} [LEN = {{Parameter|recordLength}}]


 
=== Legacy GW-BASIC syntax ===
===Legacy GW-BASIC syntax===
: [[OPEN]] {{Parameter|modeLetter$}}, [#]{{Parameter|fileNumber&}}, {{Parameter|fileName$}}[, {{Parameter|recordLength}}]
: [[OPEN]] {{Parameter|modeLetter$}}, [#]{{Parameter|fileNumber&}}, {{Parameter|fileName$}}[, {{Parameter|recordLength}}]


Line 23: Line 22:
* {{Parameter|mode}} defaults to RANDOM if the {{Parameter|mode}} or FOR access statement is omitted. (see open modes described below)
* {{Parameter|mode}} defaults to RANDOM if the {{Parameter|mode}} or FOR access statement is omitted. (see open modes described below)
* '''Only the {{Parameter|fileName$}}, {{Parameter|fileNumber&}} and LEN = {{Parameter|recordLength}} values can use variable values in the QBasic syntax.'''
* '''Only the {{Parameter|fileName$}}, {{Parameter|fileNumber&}} and LEN = {{Parameter|recordLength}} values can use variable values in the QBasic syntax.'''
* If [[LEN]] = is ommitted, sequential file record sizes default to 512 and [[RANDOM]] to 128 bytes in Qbasic.
* If [[LEN]] = is ommitted, sequential file record sizes default to 512 and [[RANDOM]] to 128 bytes in QBasic.
* {{Parameter|fileName$}} can be up to 255 characters with no limit on file name extension length in '''QB64'''.
* {{Parameter|fileName$}} can be up to 255 characters with no limit on file name extension length in '''QB64'''.
* Once a file or port is opened, it can be used in any program procedure using the assigned file number.
* Once a file or port is opened, it can be used in any program procedure using the assigned file number.
Line 31: Line 30:
* [[OPEN COM]] can also be used for serial port access in '''QB64'''.
* [[OPEN COM]] can also be used for serial port access in '''QB64'''.


 
=== Errors ===
{{PageErrors}}
* Illegal '''QB64''' Windows filename characters are ''' " * / \ | ? : < > '''. Multiple dots (periods) are allowed.
* Illegal '''QB64''' Windows filename characters are ''' " * / \ | ? : < > '''. Multiple dots (periods) are allowed.
* Possible OPEN [[ERROR Codes|errors]] include "Bad file name or number", "Bad File Mode", "File Not Found" or "Path Not Found".
* Possible OPEN [[ERROR Codes|errors]] include "Bad file name or number", "Bad File Mode", "File Not Found" or "Path Not Found".
Line 39: Line 37:




==Details==
== Details ==
===File ACCESS and LOCK Permissions===
 
=== File ACCESS and LOCK Permissions ===
* [[ACCESS]] clause limits file access to READ, WRITE or READ WRITE on a network.
* [[ACCESS]] clause limits file access to READ, WRITE or READ WRITE on a network.
* [[LOCK (access)|LOCK]] clause can specify SHARED or a LOCK READ or LOCK WRITE file lock in an OPEN statement working on a network.
* [[LOCK (access)|LOCK]] clause can specify SHARED or a LOCK READ or LOCK WRITE file lock in an OPEN statement working on a network.
Line 46: Line 45:
* If another process already has access to a specified file, program access is denied for that file OPEN access. A "Permission Denied" error 70 will be returned. A network program must be able to handle a denial of access error.
* If another process already has access to a specified file, program access is denied for that file OPEN access. A "Permission Denied" error 70 will be returned. A network program must be able to handle a denial of access error.


===File Access Modes===
=== File Access Modes ===
* FOR mode can be:
* FOR mode can be:
** '''OUTPUT''': Sequential mode creates a new file or erases an existing file for new program output. Use [[WRITE (file statement)|WRITE #]] to write numerical or text data or [[PRINT (file statement)|PRINT #]] for text. '''OUTPUT clears files of all data''' and clears the receive buffer on other devices such as [[OPEN COM|COM]].
** '''OUTPUT''': Sequential mode creates a new file or erases an existing file for new program output. Use [[WRITE (file statement)|WRITE #]] to write numerical or text data or [[PRINT (file statement)|PRINT #]] for text. '''OUTPUT clears files of all data''' and clears the receive buffer on other devices such as [[OPEN COM|COM]].
Line 55: Line 54:
** Modes '''INPUT''', '''BINARY''' and '''RANDOM''' allow a file to be concurrently opened in a different mode and number.
** Modes '''INPUT''', '''BINARY''' and '''RANDOM''' allow a file to be concurrently opened in a different mode and number.


 
=== GW-BASIC modes ===
===GW-BASIC modes===
* ''Mode letter'' is a variable or literal [[STRING]] letter value as one of the following:
* ''Mode letter'' is a variable or literal [[STRING]] letter value as one of the following:
** "A" = '''APPEND'''.
** "A" = '''APPEND'''.
Line 80: Line 78:
   {{Cl|END IF}}
   {{Cl|END IF}}
   {{Cl|FOR...NEXT|FOR}} i% = 1 {{Cl|TO}} L      'check each filename character"
   {{Cl|FOR...NEXT|FOR}} i% = 1 {{Cl|TO}} L      'check each filename character"
     code% = {{Cl|ASC}}({{Cl|MID$}}(Filename$, i%, 1)): {{Cl|COLOR}} 10      ' see ASCII codes
     code% = {{Cl|ASC (function)|ASC}}({{Cl|MID$ (function)|MID$}}(Filename$, i%, 1)): {{Cl|COLOR}} 10      ' see ASCII codes
     {{Cl|SELECT CASE}} code%      'check for errors and highlight in red
     {{Cl|SELECT CASE}} code%      'check for errors and highlight in red
         '{{Cl|CASE}} 34, 42 {{Cl|TO}} 44, 47, 58 {{Cl|TO}} 63, 91 {{Cl|TO}} 93, 124: E% = E% + 1: {{Cl|COLOR}} 12 ' '''QBasic errors'''
         '{{Cl|CASE}} 34, 42 {{Cl|TO}} 44, 47, 58 {{Cl|TO}} 63, 91 {{Cl|TO}} 93, 124: E% = E% + 1: {{Cl|COLOR}} 12 ' '''QBasic errors'''
Line 94: Line 92:


{{OutputStart}}
{{OutputStart}}
                         {{text|Hello|#54FC54}}{{text|,|red}}{{text|~1.mp3|#54FC54}}  {{text|Total Errors|yellow}}<nowiki> = </nowiki>{{text|1|yellow}}
                         {{Text|Hello|#54FC54}}{{Text|,|red}}{{Text|~1.mp3|#54FC54}}  {{Text|Total Errors|yellow}}<nowiki> = </nowiki>{{Text|1|yellow}}
{{OutputEnd}}
{{OutputEnd}}
:''Note:'' The screen output displays filename characters in green except for red comma QBasic error.
:''Note:'' The screen output displays filename characters in green except for red comma QBasic error.
Line 109: Line 107:
     {{Cl|PRINT (file statement)|PRINT}} #i, "Hello World, Screen and File version"
     {{Cl|PRINT (file statement)|PRINT}} #i, "Hello World, Screen and File version"
NEXT
NEXT
{{CodeEnd}}{{small|code by Steve McNeill}}
{{CodeEnd}}
{{Small|code by Steve McNeill}}
: ''Note:'' Linux or macOS file names can use a path destination such as ".\SCRN:" to use SCRN: as an actual file name.
: ''Note:'' Linux or macOS file names can use a path destination such as ".\SCRN:" to use SCRN: as an actual file name.


Line 151: Line 150:
* [[INPUT$]], [[LINE INPUT (file statement)]]
* [[INPUT$]], [[LINE INPUT (file statement)]]
* [[CLOSE]], [[LOF]], [[EOF]], [[LOC]]
* [[CLOSE]], [[LOF]], [[EOF]], [[LOC]]
* [[SEEK (statement)]], [[SEEK]]
* [[SEEK]], [[SEEK (function)]]
* [[OPEN COM]], [[LEN]], [[RESET]]
* [[OPEN COM]], [[LEN]], [[RESET]]
* [[FIELD]], [[TYPE]]
* [[FIELD]], [[TYPE]]
* [[_FILEEXISTS]], [[_DIREXISTS]]
* [[_FILEEXISTS]], [[_DIREXISTS]]
* [[_OPENCLIENT]], [[_OPENHOST]], [[_OPENCONNECTION]] {{text|(TCP/IP)}}
* [[_OPENCLIENT]], [[_OPENHOST]], [[_OPENCONNECTION]]
* [[_SNDOPEN]], [[_LOADIMAGE]]
* [[_SNDOPEN]], [[_LOADIMAGE]]




{{PageNavigation}}
{{PageNavigation}}

Latest revision as of 00:41, 26 February 2023

The OPEN statement is used to open a file or COM serial communications port for program input or output.


Syntax

OPEN fileName$ [FOR mode] [{ACCESS|{LOCK|SHARED}} [{READ|WRITE}] AS [#]fileNumber& [LEN = recordLength]

Legacy GW-BASIC syntax

OPEN modeLetter$, [#]fileNumber&, fileName$[, recordLength]


Parameters

  • The fileName$ is a STRING variable or literal file name (path optional) in quotes.
  • FOR mode can be: APPEND (write to end), BINARY (read/write), INPUT (read), OUTPUT (write new) or RANDOM (read/write).
  • GW-BASIC's modeLetter$ is a STRING variable or the letter "A", "B", "I", "O" or "R" designating the OPEN modes above.
  • fileNumber& can be any positive INTEGER or LONG whole number value or an unused value determined by the FREEFILE function.
  • LEN = or recordLength is optional to denote the RANDOM file record byte length (default = 128) or sequential (default = 512) load buffer.


Description

  • QB64 can open as many files as your computer memory can handle. QBasic could only open about 15 at a time.
  • QB64 will allocate 4 bytes of memory for every possible file number up to the highest number used in a program.
  • mode defaults to RANDOM if the mode or FOR access statement is omitted. (see open modes described below)
  • Only the fileName$, fileNumber& and LEN = recordLength values can use variable values in the QBasic syntax.
  • If LEN = is ommitted, sequential file record sizes default to 512 and RANDOM to 128 bytes in QBasic.
  • fileName$ can be up to 255 characters with no limit on file name extension length in QB64.
  • Once a file or port is opened, it can be used in any program procedure using the assigned file number.
  • The "SCRN:" device is supported in version 1.000 and up (see Example 3).
  • Devices such as "KYBD:", "CONS:", "COMn" and "LPTn:" are not supported in QB64..
Note: OPEN "LPTn" is not supported by QB64, but may be supported directly by your operating system.
  • OPEN COM can also be used for serial port access in QB64.

Errors

  • Illegal QB64 Windows filename characters are " * / \ | ? : < > . Multiple dots (periods) are allowed.
  • Possible OPEN errors include "Bad file name or number", "Bad File Mode", "File Not Found" or "Path Not Found".
    • An OPEN file not found error may occur if CHR$(0) to (31) are used in a Windows file name.
  • QB64 does not have DOS file name limitations.


Details

File ACCESS and LOCK Permissions

  • ACCESS clause limits file access to READ, WRITE or READ WRITE on a network.
  • LOCK clause can specify SHARED or a LOCK READ or LOCK WRITE file lock in an OPEN statement working on a network.
  • A separate LOCK statement can lock or UNLOCK file access on a network using a format that can lock specific records.
  • If another process already has access to a specified file, program access is denied for that file OPEN access. A "Permission Denied" error 70 will be returned. A network program must be able to handle a denial of access error.

File Access Modes

  • FOR mode can be:
    • OUTPUT: Sequential mode creates a new file or erases an existing file for new program output. Use WRITE # to write numerical or text data or PRINT # for text. OUTPUT clears files of all data and clears the receive buffer on other devices such as COM.
    • APPEND: Sequential mode creates a new file if it doesn't exist or appends program output to the end of an existing file. Use WRITE # for numerical or text data or PRINT # for text as in the OUTPUT mode. APPEND does not remove previous data.
    • INPUT : Sequential mode only reads input from an existing file. File error if file does not exist. Use INPUT # for comma separated numerical or text data and LINE INPUT # or INPUT$ to only read text data. Use _FILEEXISTS or _DIREXISTS to avoid errors.
    • BINARY: Creates a new file when it doesn't exist or reads and writes to an existing binary file. Use GET # to read or PUT # to write byte positions simultaneously. LEN = statements are ignored in this mode.
    • RANDOM: Creates a new file when it doesn't exist or reads or writes to an existing random file record. Use GET # or PUT # to read or write to file records. A LEN = statement can define the byte size of a record (no LEN statement defaults to 128 bytes)
    • Modes INPUT, BINARY and RANDOM allow a file to be concurrently opened in a different mode and number.

GW-BASIC modes

  • Mode letter is a variable or literal STRING letter value as one of the following:
    • "A" = APPEND.
    • "B" = BINARY.
    • "I" = INPUT.
    • "O" = OUTPUT.
    • "R" = RANDOM.


Examples

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 QBasic character error list is commented out and the function will return invalid filenames under QB64.

                         Hello,~1.mp3  Total Errors = 1
Note: The screen output displays filename characters in green except for red comma QBasic error.


Example 2: When OPEN "SCRN:" FOR OUTPUT AS #f is used, PRINT #f will print the text to the screen instead of to a file:

f% = FREEFILE 'should always be 1 at program start
OPEN "SCRN:" FOR OUTPUT AS #f%
g% = FREEFILE 'should always be 2 after 1
OPEN "temp.txt" FOR OUTPUT AS #g%

FOR i = 1 TO 2
    PRINT #i, "Hello World, Screen and File version"
NEXT
code by Steve McNeill
Note: Linux or macOS file names can use a path destination such as ".\SCRN:" to use SCRN: as an actual file name.


Example 3: Showcasing different file modes.

CLS

OPEN "test.tst" FOR OUTPUT AS #1
PRINT #1, "If test.tst didn't exist:"
PRINT #1, "A new file was created named test.tst and then deleted."
PRINT #1, "If test.tst did exist:"
PRINT #1, "It was overwritten with this and deleted."
CLOSE #1

OPEN "test.tst" FOR INPUT AS #1
DO UNTIL EOF(1)
INPUT #1, a$
PRINT a$
LOOP
CLOSE #1

KILL "test.tst"

END

If test.tst didn't exist:
A new file was created named test.tst and then deleted.
If test.tst did exist:
It was overwritten with this and deleted.
Warning: Make sure you don't have a file named test.tst before you run this or it will be overwritten.


See also



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link