ZetCode

FreeBasic Seek 关键字

最后修改日期:2025 年 6 月 16 日

FreeBasic 的 Seek 关键字用于移动打开文件的文件位置指针。它通过将指针定位到特定字节位置来实现对文件内容的随机访问。

基本定义

在 FreeBasic 中,Seek 是一个改变文件中当前位置的语句。它可用于以随机访问方式打开的二进制文件和文本文件。

Seek 函数返回文件指针的当前位置。两者结合使用,可以实现对文件内容的精确导航。FreeBasic 中的文件位置是基于 1 的(第一个字节是位置 1)。

Seek 语句语法

Seek 语句具有以下语法

Seek #fileNumber, position

fileNumber 是打开文件时使用的编号。position 是文件指针的新位置(基于 1)。

Seek 函数语法

Seek 函数具有以下语法

currentPosition = Seek(fileNumber)

它返回指定文件的文件指针的当前位置。这对于跟踪你在文件中的位置非常有用。

基本的 Seek 示例

此示例演示了使用 Seek 进行基本的文件定位。

seek_basic.bas
Dim f As Integer = FreeFile()
Open "test.txt" For Output As #f
Print #f, "Hello World"
Close #f

Open "test.txt" For Input As #f
Seek #f, 7
Dim s As String
Input #f, s
Close #f

Print "Read from position 7: "; s

我们首先创建一个包含一些文本的文件。然后我们重新打开它,并使用 Seek 将位置定位到字节 7,然后再进行读取。这将从文件中读取“World”。位置是基于 1 的,因此字节 7 是“World”中的“W”。

在二进制文件中使用 Seek

Seek 在处理二进制文件时特别有用。

seek_binary.bas
Dim f As Integer = FreeFile()
Open "data.bin" For Binary As #f

' Write three integers at specific positions
Seek #f, 1
Put #f, , 100
Seek #f, 5
Put #f, , 200
Seek #f, 9
Put #f, , 300

' Read the second integer
Seek #f, 5
Dim value As Integer
Get #f, , value
Close #f

Print "Value at position 5: "; value

这会创建一个二进制文件并在特定位置写入整数。然后我们定位到位置 5 并读取存储在那里的值。每个整数在 FreeBasic 中占用 4 个字节(默认情况下),因此我们相应地进行间隔。

使用 Seek 函数

此示例显示了如何使用 Seek 函数来跟踪文件位置。

seek_function.bas
Dim f As Integer = FreeFile()
Open "positions.txt" For Output As #f

Print #f, "First line"
Print "Current position: "; Seek(f)
Print #f, "Second line"
Print "Current position: "; Seek(f)
Print #f, "Third line"
Print "Current position: "; Seek(f)

Close #f

在我们向文件写入行时,我们使用 Seek 函数来监控当前位置。每个 Print 语句都会使位置前进写入的字符数加上行结束符。

使用 Seek 进行随机访问

Seek 实现了对文件内容的真正随机访问。

seek_random.bas
Dim f As Integer = FreeFile()
Open "random.txt" For Output As #f
For i As Integer = 1 To 10
    Print #f, "Record "; i
Next
Close #f

' Read records in reverse order
Open "random.txt" For Input As #f
Dim fileSize As Long = Lof(f)
For i As Integer = 10 To 1 Step -1
    Seek #f, (i-1)*9 + 1  ' Each record is 9 bytes ("Record X" + newline)
    Dim s As String
    Line Input #f, s
    Print s
Next
Close #f

我们首先创建一个包含 10 条记录的文件。然后我们重新打开它,并通过计算记录的位置以相反的顺序读取它们。每条记录长 9 个字节(包括换行符),因此我们将索引乘以 9。

使用 Seek 处理大文件

Seek 可以通过使用 Long 或 Integer64 位置来处理大文件。

seek_large.bas
Dim f As Integer = FreeFile()
Open "large.bin" For Binary As #f

' Write data at large positions
Seek #f, 1000000
Put #f, , 12345
Seek #f, 2000000
Put #f, , 67890

' Read back
Seek #f, 1000000
Dim value1 As Integer
Get #f, , value1

Seek #f, 2000000
Dim value2 As Integer
Get #f, , value2

Close #f

Print "Values: "; value1; " and "; value2

这演示了 Seek 在处理大文件位置(数百万字节)时的用法。FreeBasic 正确处理这些位置,允许访问大文件的任何部分。

Seek 和文件大小

Seek 可与 Lof 一起使用,以相对于文件大小进行导航。

seek_filesize.bas
Dim f As Integer = FreeFile()
Open "example.txt" For Binary As #f

' Write some data
For i As Integer = 1 To 100
    Put #f, , CByte(i)
Next

' Read last 10 bytes
Seek #f, Lof(f) - 9
Dim lastBytes(1 To 10) As Byte
Get #f, , lastBytes()

Close #f

Print "Last 10 bytes:"
For i As Integer = 1 To 10
    Print lastBytes(i); " ";
Next

我们创建一个包含 100 字节的二进制文件,然后使用 Seek 和 Lof(文件长度)将位置定位到文件末尾附近。这种模式对于读取许多文件格式的文件页脚或尾部非常有用。

Seek 的错误处理

使用 Seek 时,正确处理错误非常重要。

seek_errors.bas
Dim f As Integer = FreeFile()
Open "test.bin" For Binary As #f

' Try to seek beyond file end
On Error Goto ErrorHandler
Seek #f, 100000

Print "Seek successful"
Close #f
Exit Sub

ErrorHandler:
Print "Error "; Err; " occurred: "; Error(Err)
Close #f
End

这展示了如何处理 Seek 错误,尤其是在尝试定位到文件末尾之外时。On Error 语句会捕获在 Seek 操作期间发生的任何运行时错误。

最佳实践

本教程通过实际示例,涵盖了 FreeBasic 的 Seek 关键字,展示了在不同场景下的文件定位。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 FreeBasic 教程