当前位置:编程学习 > VB >>

在vb中如何用二进制访问文件

答案:Open 语句
能够对文件输入/输出 (I/O)。

语法
Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]
Open 语句的语法具有以下几个部分:

部分描述
        pathname 必要。字符串表达式,指定文件名,该文件名可能还包括目录、文件夹及驱动器。
        mode 必要。关键字,指定文件方式,有 Append、Binary、Input、Output、或 Random 方式。如果未指定方式,则以 Random 访问方式打开文件。
        access 可选。关键字,说明打开的文件可以进行的操作,有 Read、Write、或 Read Write 操作。
        lock 可选。关键字,说明限定于其它进程打开的文件的操作,有 Shared、Lock Read、Lock Write、和 Lock Read Write 操作。
        filenumber 必要。一个有效的文件号,范围在 1 到 511 之间。使用 FreeFile 函数可得到下一个可用的文件号。
        reclength 可选。小于或等于 32,767(字节)的一个数。对于用随机访问方式打开的文件,该值就是记录长度。对于顺序文件,该值就是缓冲字符数。


说明
对文件做任何 I/O 操作之前都必须先打开文件。Open 语句分配一个缓冲区供文件进行 I/O 之用,并决定缓冲区所使用的访问方式。
如果 pathname 指定的文件不存在,那么,在用 Append、Binary、Output、或 Random 方式打开文件时,可以建立这一文件。
如果文件已由其它进程打开,而且不允许指定的访问类型,则 Open 操作失败,而且会有错误发生。
如果 mode 是 Binary 方式,则 Len 子句会被忽略掉。
重要 在 Binary、Input 和 Random 方式下可以用不同的文件号打开同一文件,而不必先将该文件关闭。在 Append 和 Output 方式下,如果要用不同的文件号打开同一文件,则必须在打开文件之前先关闭该文件。

Get 语句
将一个已打开的磁盘文件读入一个变量之中。
语法
Get [#]filenumber, [recnumber], varname


Get 语句的语法具有以下几个部分:
部分 描述
filenumber 必要。任何有效的文件号。
recnumber 可选。Variant (Long)。记录号(Random 方式的文件)或字节数(Binary 方式的文件),以表示在此处开始读出数据。
varname 必要。一个有效的变量名,将读出的数据放入其中。


说明
通常用 Put 将 Get 读出的数据写入一个文件。
文件中第一个记录或字节位于位置 1,第二个记录或字节位于位置 2,依此类推。若省略 recnumber,则会读出紧随上一个 Get 或 Put 语句之后的下一个记录或字节(或读出最后一个 Seek 函数指出的记录或字节)。所有用于分界的逗号都必须罗列出来,例如:

Get #4,,FileBuffer

下列规则适用于以 Random 方式打开的文件:

如果要读出的数据的长度小于 Open 语句的 Len 子句中所指定的长度,Get 会在某个边界之内读出随后的记录,在这里,边界的长度等于记录的长度。将此文件缓冲区内的现有内容填入到一个空间之内,该空间介于一个记录的结尾与下一个记录的开头之间。因为无法确定填入的数据量,所以,应设法使记录的长度与读出的数据长度一致,这通常是个好办法。

如果读出的变量是一个可变长度字符串,则 Get 语句先读出一个含有字符串长度的双字节描述符,然后读出放入变量中的数据。所以,Open 语句中的 Len 子句所指定的记录长度必须至少比字符串的实际长度多两个字节。

如果读出的变量是一个数值类型的 Variant,则 Get 先读出两个字节,识别 Variant 的 VarType,然后读出放入此变量中的数据。例如,在读出 VarType 3 的 Variant 时,Get 读出六个字节:前两个字节说明 Variant 为 VarType 3 (Long),后四个字节则包含 Long 类型数据。Open 语句中的 Len 子句所指定的记录长度必须至少比储存变量所需的实际长度多两个字节。
注意 可以使用 Get 语句从磁盘中读出一个 Variant 数组,但不能使用它读出包含数组的标量 Variant。也不能使用 Get 从磁盘中读出对象。

如果读出的变量是 VarType 8 (String) 的 Variant,则 Get 先读出两个字节,识别 VarType,接下来的两个字节指出字符串的长度,然后读出字符串数据。Open 语句中的 Len 子句所指定的记录长度必须比实际字符串的长度至少多四个字节。

如果读出的变量是一个动态数组,则 Get 会读出一个描述符,其长度等于 2 加上 8 乘以维数,即 2 + 8 * NumberOfDimensions。读出数组数据和数组描述符就需要占据字节,而 Open 语句中的 Len 子句所指定的记录长度必须大于或等於这些字节数的总和。 例如,在将数组写入磁盘时,下列数组声明需要 118 个字节:
Dim MyArray(1 To 5,1 To 10) As Integer

这 118 个字节的分配情况如下:18 个字节用于描述符 (2 + 8 * 2),100 个字节用于数据 (5 * 10 * 2)。

如果读出的变量是一个大小固定的数组,则 Get 只读出数据。它不读出描述符。

如果读出的变量是任何其他类型的变量(不是可变长度的字符串或 Variant£©,则 Get 只读出变量数据。Open 语句中的 Len 子句所指定的记录长度必须大于或等於要读出的数据的长度。

Get 在读出用户定义类型的元素时,好象是单独地读出每一个元素,只是不在元素之间进行填充。在磁盘上,(用 Put 写入的)用户定义的类型的动态数组之前有一个描述符,其长度等于 2 加上 8 乘以维数,即 2 + 8 * NumberOfDimensions。Open 语句中的 Len 子句所指定的记录长度必须大于或等於读出个别元素(包括任何数组及其描述符在内)所需的全部字节数总和。
对于以 Binary 方式打开的文件,Random 的所有规则都适用,但以下情况除外:

当 Open 语句中的 Len 子句不起作用时,Get 连续从磁盘中读出所有变量;也就是说,两个记录之间没有任何填充。

对于任何不属于用户定义的类型的数组,Get 只读出数据。它不会读出描述符。

Get 读出可变长度字符串,不管这些字符串是否具有长度为 2 字节的描述符,它们都不是用户定义的类型的元素。所读出的字节数等於字符串已包含的字符数。例如,下列语句从文件号为 1 的文件中读出十个字节:
VarString = String(10, )
Get #1,,VarString


Dim bit() As Byte
Open Mypicture For Binary As #1
            ReDim bit(LOF(1)) As Byte
            Get 1, 1, bit
            Close 1
写:
Open Mypicture For Binary As #1
            put 1, 1, yourdata
            Close 1
Dim bit() As Byte

要实现你的要求,可这样:

Open Mypicture For Binary As #1
            ReDim bit(LOF(1)) As Byte
            Get 1, 1, bit
            Close 1
Dim bit() As Byte
'查找40H并换成FFH
For I = 0 To UBound(bit)
   if bit(i)=64 then
      bit(i)=256
   end if
Next

'最后写入
Dim bit() As Byte
Open Mypicture For Binary As #1
            put 1, 1, bit
            Close 1

Dim bit() As Byte
dim file1 as integer
dim temp as byte
open "filename" for binary access read write as file1
temp=&hff
put &h40,temp
close(file1)

dim file1 as integerdim temp as bytefile1=freefileopen "filename" for binary access read write as file1temp=&hffput &h40,temp==>put file1,&h40,tempclose(file1)

上一个:VB,API问题看如下代码
下一个:急需vb问题 我还要原因怎样来的

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,