Basic has a strongly moded set of techniques for performing file IO that are reliable and well understood but you can also do your file IO in pure API code if you like the reduced size and excellent performance. These have been parallel prototyped so they don't interfere with the standard API declarations and they can be plonked directly into PBCC50 without having to call the main win32api.inc file.
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
DECLARE FUNCTION closef LIB "KERNEL32.DLL" ALIAS "CloseHandle" ( _
BYVAL hObject AS DWORD) AS LONG
' --------------------------------------------
FUNCTION fclose(ByVal hFile as DWORD) as DWORD
FUNCTION = closef(hFile)
END FUNCTION
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
DECLARE FUNCTION fcreateA LIB "KERNEL32.DLL" ALIAS "CreateFileA" ( _
ByVal lpFileName AS DWORD, _
ByVal dwDesiredAccess AS DWORD, _
ByVal dwShareMode AS DWORD, _
ByVal lpSecurityAttributes AS DWORD, _
ByVal dwCreationDisposition AS DWORD, _
ByVal dwFlagsAndAttributes AS DWORD, _
BYVAL hTemplateFile AS DWORD) AS DWORD
' MACRO GENERIC_WRITE = &H40000000&
' MACRO CREATE_ALWAYS = 2
' MACRO FILE_ATTRIBUTE_NORMAL = &H00000080
' -------------------------------
FUNCTION fcreate(fname$) as DWORD
FUNCTION = fcreateA(StrPtr(fname$),&H40000000&,0,0,2,&H00000080,0)
END FUNCTION
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
DECLARE FUNCTION open_fileA LIB "KERNEL32.DLL" ALIAS "CreateFileA" ( _
ByVal lpFileName AS DWORD, _
ByVal dwDesiredAccess AS DWORD, _
ByVal dwShareMode AS DWORD, _
ByVal lpSecurityAttributes AS DWORD, _
ByVal dwCreationDisposition AS DWORD, _
ByVal dwFlagsAndAttributes AS DWORD, _
BYVAL hTemplateFile AS DWORD) AS DWORD
' MACRO GENERIC_READ = &H80000000&
' MACRO GENERIC_WRITE = &H40000000&
' MACRO OPEN_EXISTING = 3
' MACRO FILE_ATTRIBUTE_NORMAL = &H00000080
' -----------------------------
FUNCTION fopen(fname$) as DWORD
FUNCTION = open_fileA(StrPtr(fname$),&H80000000& or &H40000000&,0,0,3,&H00000080,0)
END FUNCTION
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
DECLARE FUNCTION file_print LIB "KERNEL32.DLL" ALIAS "WriteFile" ( _
BYVAL hFile AS DWORD,ByVal lpBuffer AS DWORD, _
BYVAL nNumberOfBytesToWrite AS DWORD, _
ByVal NumberOfBytesWritten AS DWORD,ByVal lpOverlapped AS DWORD) AS LONG
' --------------------------------------------------
FUNCTION fprint(ByVal hFile as DWORD,bdat$) as DWORD
#REGISTER NONE
LOCAL pdat as DWORD ' string pointer
LOCAl ldat as DWORD ' data length
LOCAL bwrt as DWORD ' bytes written variable
bdat$ = bdat$+chr$(13,10)
pdat = StrPtr(bdat$) ' get string address
! mov eax, pdat
! mov eax, [eax-4] ' get string length
! mov ldat, eax
file_print(hFile,pdat,ldat,VarPtr(bwrt),0)
FUNCTION = bwrt
END FUNCTION
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
DECLARE FUNCTION file_read LIB "KERNEL32.DLL" ALIAS "ReadFile" ( _
BYVAL hFile AS DWORD,ByVal pbuff as DWORD, BYVAL nNumberOfBytesToRead AS DWORD, _
ByVal lpNumberOfBytesRead AS DWORD, ByVal lpOverlapped AS DWORD) AS LONG
' ----------------------------------------------------------------
FUNCTION fread(ByVal hFile as DWORD,ByVal bcnt as DWORD) as STRING
LOCAL pdat as DWORD ' string pointer
LOCAL bred as DWORD ' bytes read variable
buffer$ = nul$(bcnt)
pdat = StrPtr(buffer$)
file_read(hFile,pdat,bcnt,VarPtr(bred),0)
If bred <> bcnt Then
buffer$ = left$(buffer$,bred)
End If
FUNCTION = buffer$
END FUNCTION
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
DECLARE FUNCTION file_seek LIB "KERNEL32.DLL" ALIAS "SetFilePointer" ( _
BYVAL hFile AS DWORD, BYVAL lDistanceToMove AS LONG, lpDistanceToMoveHigh AS LONG, _
BYVAL dwMoveMethod AS DWORD) AS LONG
MACRO FILE_BEGIN = 0
MACRO FILE_CURRENT = 1
MACRO FILE_END = 2
' ------------------------------------------------------------------------------------------
FUNCTION fseek(ByVal hFile as DWORD,ByVal plusminus as LONG,ByVal mvmethod as DWORD) as LONG
FUNCTION = file_seek(hFile,plusminus,0,mvmethod)
END FUNCTION
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
DECLARE FUNCTION file_size LIB "KERNEL32.DLL" ALIAS "GetFileSize" ( _
BYVAL hFile AS DWORD, lpFileSizeHigh AS LONG) AS LONG
' -------------------------------------------
FUNCTION fsize(ByVal hFile as DWORD) as DWORD
FUNCTION = file_size(hFile,0)
END FUNCTION
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
DECLARE FUNCTION file_write LIB "KERNEL32.DLL" ALIAS "WriteFile" ( _
BYVAL hFile AS DWORD,ByVal lpBuffer AS DWORD, _
BYVAL nNumberOfBytesToWrite AS DWORD, _
ByVal NumberOfBytesWritten AS DWORD,ByVal lpOverlapped AS DWORD) AS DWORD
' -------------------------------------------------
FUNCTION fwrite(ByVal hFile as DWORD,bdat$) as DWORD
#REGISTER NONE
LOCAL pdat as DWORD ' string pointer
LOCAl ldat as DWORD ' data length
LOCAL bwrt as DWORD ' bytes written variable
pdat = StrPtr(bdat$) ' get string address
! mov eax, pdat
! mov eax, [eax-4] ' get string length
! mov ldat, eax
file_write(hFile,pdat,ldat,VarPtr(bwrt),0)
FUNCTION = bwrt
END FUNCTION
' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤