Skip to content

FreeBASIC 文件 I/O


在 FreeBASIC 中,有 4 种可能的文件 I/O 执行方式:

  1. 使用内置的 BASIC 命令,如 OpenGetPutClose。这种方式在 FreeBASIC 支持的所有平台上基本上是可移植的。打开的文件由"文件编号"标识,这些编号是 FreeBASIC 特有的,不能传递到下面的函数中。

  2. 使用 FreeBASIC 依赖的 C 库的 C 流 I/O 函数,如 fopen、fread、ftell、fclose(参见 C 标准库函数 中的流 I/O)。这比上面的方法稍快,并添加了一些额外功能,而且仍然具有良好的可移植性。打开的文件由文件指针标识,就像在 C 语言中一样,同样是此访问方法唯一的。FileAttr 函数可用于从上述 1 中的文件编号返回流 I/O 指针。

  3. 使用 C 低级 I/O 函数,如 _open、_read、_write、_close(参见 C 标准库函数 中的低级 I/O)。这些函数应该是可移植的,但目前头文件仅适用于 Win32,因此使用它们的代码目前无法编译到其他平台。

  4. 直接与操作系统内核通信(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

另请参阅

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系