FreeBASIC 文件 I/O
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=ProPgFileIO
- 最后更新: 2021-10-30
在 FreeBASIC 中,有 4 种可能的文件 I/O 执行方式:
使用内置的 BASIC 命令,如
Open、Get、Put和Close。这种方式在 FreeBASIC 支持的所有平台上基本上是可移植的。打开的文件由"文件编号"标识,这些编号是 FreeBASIC 特有的,不能传递到下面的函数中。使用 FreeBASIC 依赖的 C 库的 C 流 I/O 函数,如 fopen、fread、ftell、fclose(参见 C 标准库函数 中的流 I/O)。这比上面的方法稍快,并添加了一些额外功能,而且仍然具有良好的可移植性。打开的文件由文件指针标识,就像在 C 语言中一样,同样是此访问方法唯一的。
FileAttr函数可用于从上述 1 中的文件编号返回流 I/O 指针。使用 C 低级 I/O 函数,如 _open、_read、_write、_close(参见 C 标准库函数 中的低级 I/O)。这些函数应该是可移植的,但目前头文件仅适用于 Win32,因此使用它们的代码目前无法编译到其他平台。
直接与操作系统内核通信(DOS:使用 DOS 和 DPMI INT,Win32:使用 API 调用如 CreateFile、WriteFile)。这不再是可移植的。文件由操作系统内核生成的句柄标识。
此示例展示了上面描述的方法 1 和 2:
示例
start GeSHi
vb
'==== File I/O example / 2018-05-18 ====
Dim As String fileName = "test_123.tmp"
Dim As Ulong buffer(0 To 99) '100 x 4 bytes
Dim As Integer numItems, result
Print !"\n==== Using the C Runtime (CRT) file I/O ====\n"
#Include Once "crt/stdio.bi"
Dim As FILE Ptr filePtr
'open in binary writing mode
filePtr = fopen(fileName, "wb")
If filePtr <> 0 Then
'write 75 x 4 = 300 bytes
numItems = fwrite(@buffer(0), SizeOf(buffer(0)), 75, filePtr)
Print "Number of bytes written: " & Str(numItems * SizeOf(buffer(0)))
Print "Number of items written: " & Str(numItems)
fclose(filePtr)
Else
Print "Failed to open " & fileName & " for writing"
End If
'open in binary reading mode
filePtr = fopen(fileName, "rb")
If filePtr <> 0 Then
'skip the first 25 items
If fseek(filePtr, SizeOf(buffer(0)) * 25, SEEK_SET) <> 0 Then
Print "Failed to seek (set file stream position)"
End If
'try to read the next 100 items
numItems = fread(@buffer(0), SizeOf(buffer(0)), 100, filePtr)
Print "Number of bytes read: " & Str(numItems * SizeOf(buffer(0)))
Print "Number of items read: " & Str(numItems)
fclose(filePtr)
Else
Print "Failed to open " & fileName & " for reading"
End If
result = remove(fileName) 'delete file
If result = 0 Then Print "Removed: " & fileName
Print !"\n==== Using the FreeBASIC file I/O ====\n"
Dim As Long fileNum
Dim As Integer numBytes
fileNum = FreeFile
'open in binary writing mode
If Open(fileName, For Binary, Access Write, As fileNum) = 0 Then
'write 75 x 4 = 300 bytes
result = Put(fileNum, , buffer(0), 75) 'No @buffer(0)
numBytes = Seek(fileNum) - 1 'FreeBASIC file position is 1-based
Print "Number of bytes written: " & Str(numBytes)
Print "Number of items written: " & Str(numBytes \ SizeOf(buffer(0)))
Close(fileNum)
Else
Print "Failed to open " & fileName & " for writing"
End If
'open in binary reading mode
If Open(fileName, For Binary, Access Read, As fileNum) = 0 Then
'skip the first 25 items
Seek fileNum, 25 * SizeOf(buffer(0)) + 1 'Note: +1 & seek(...) not allowed
'try to read the next 100 items
result = Get(fileNum, , buffer(0), 100, numBytes)
Print "Number of bytes read: " & Str(numBytes)
Print "Number of items read: " & Str(numBytes \ SizeOf(buffer(0)))
Close(fileNum)
Else
Print "Failed to open " & fileName & " for reading"
End If
result = Kill(fileName) 'delete file
If result = 0 Then Print "Killed: " & fileName
Print !"\n==== End ====\n"end GeSHi
另请参阅
返回 目录