第 10章 Visual
Basic中的文件操作
人民邮电出版社
21世纪高等学校计算机基础教育系列教材文件概述文件是把数据记录在外存储器上的集合。
文件结构
数据的特定的存放方式叫做文件结构,vb中文件有记录组成,记录由字段组成,字段有字符组成。
字符( character)是构成文件的基本单位,字符可以是字母、数字、特殊符号、或单一字节,一个字符用一个字节存放(西文),汉字字符包括汉字和全角符号,用两个字节存放。 Vb支持双字节字符,当计算字符串长度时,一个西文字符和一个汉字字符的长度均为 1,但存储空间不一样。
Len(,Vb程序设计”) =6 但占用存储空间是 10字节。
字段( field):也叫域,有若干个字符组成,表示一个数据项。
记录( record):有一组相关的字段组成。
文件( file):由记录组成,一个文件含有一条以上的记录。
文件的种类
根据分类标准不同,文件的分类也不同。
文件的分类依据及类别
根据数据性质:程序文件和数据文件
根据存放方式和结构:顺序文件和随机文件
顺序文件,结构比较简单,按次序排放记录,维护困难,存取不灵活,
但占用空间少,容易使用。
随机文件,也称直接存取文件,在访问时不考虑各记录的位置或顺序,
可根据需要访问任意记录,各记录长度固定,均有记录号,只要知道记录号就可以随机文件进行存取,可同时进行读写操作,可以快速修改、
查询记录,比较灵活、方便,速度快,易修改,但占用空间大,数据组织较复杂。
根据编码方式,ascii文件和二进制文件打开关闭文件
Vb中,数据文件的操作按下列步骤进行:
1,打开(或建立)文件 2,进行读、写操作 3.关闭文件
文件打开
Open 文件名 [for 方式 ] [access 存取类型 ] [锁定 ] as [#] 文件号 [ len=记录长度 ]
方式:
output 顺序输出方式 input 顺序输入方式 append 指定顺序输出方式
Append和 output的区别,output指针置于文件头,append指针置于文件尾
Random 随即存取方式(默认方式) binary 二进制方式文件
Random方式中,如果不指定 access,则试图按以下次序打开文件读 /写 只读 只写
Binary方式中,用 get和 put语句对文件中任何字节位置的信息进行读写,如果没有 access语句,和上面
random方式中的次序一致
存取类型:
Read 只读 write 只写 read write 读写(只对二进制文件、随机文件和 append方式有用。)
锁定,在多用户或多进程的环境下使用。默认请况下,在文件打开期间,出奔晋城外的其他进程是不允许存取文件的,主要有以下几类锁定方式:
Lock shared 任何机器上的任何进程都可以存取该文件
Lock read 不允许其他进程读文件
Lock write 不允许其他进程写文件
Lock read write 不允许其他进程读写文件。默认方式。
文件号:整型表达式,1-511
记录长度:整型表达式。 <=32767,默认 512时决定打开文件的缓冲区大小的一个选项。
为满足不同需要,可以对一个文件用几个不同的文件号打开。
Open语句同时有建立和打开文件的功能。
文件关闭,close [#文件号 ],如果没有指定文件号,则关闭所有打开的文件。
文件操作语句与函数
文件的主要操作:读和写
文件指针,文件打开后自动生成一个隐含的文件指针,文件的读写操作就从指针出开始。
文件指针定位用,seek #文件号,位置 来实现,指针位置取值范围在 1-(232-1)间
可以用 seek函数来判断指针位置 seek(文件号 ) 取得一个在 1-(232-1)之间的数。
Freefile 可以得到一个在程序中一打开但还没有使用的文件,也可以利用本函数把为使用的文件号给一个变量,从而可以直接引用文件号变量,而省去了记忆文件号的麻烦。
Private Sub Form_Click()
FileName$ = InputBox$("输入要打开的文件得文件名 ")
filenum = FreeFile
Open FileName$ For Output As filenum
Print FileName$; "opend as file #"; filenum
Close #filenum
End Sub
Private Sub Command1_Click()
Close
End
End Sub
Loc函数 loc(文件号) 返回当前文件号指定的的文件的读写位置。
Lof函数 lof(文件号) 返回给定的文件的字节数(求文件长度)。
Eof函数 eof(文件号) 判断文件是否结束(指针是否已到文件尾)
文件操作语句与函数顺序文件
写操作:
Print #语句
Print #文件号,[[spc( n) |tab( n) ][表达式列表 ][; |,]]
把数据写入到文件中,其中的参数和 print方法一致。
实际上只是把文件内容写到缓冲区,然后又文件系统真正地写入顺序文件。
Write #语句
Write #文件号,表达式表
将表达式表写入到顺序文件中,但是文件必须以 output或 append方式打开。
Write# 和 print#功能基本一样,区别在于使用 write#语句写数据时,数据在磁盘上以紧凑格式存放,能自动在数据之间加,并给字符串加双引号
Write#语句写入证书的前面没有空格。
如果用 write#语句将数据写入到一个加 lock定义的文件,系统会报错。
顺序文件
读操作:
Input#语句
Input #文件号,变量表,从顺序文件中读出数据,赋给变量。
Line input # 语句
line input #文件号,字符串变量
从顺序文件中读取一个完整的行,赋给字符串变量。
Input$函数
Input$( n,#文件号),从指定文件中读取 n个字符的字符串。
随机文件
特点:记录定长
记录分成若干字段
个变量按一定格式植入相应字段
随机文件打开后,既可读也可写
打开随机文件:
Open 文件名 for random as #文件号 [ len=记录长度 ]
写操作:
Put #文件号,[记录号 ],变量
例如 put #1,125,record1
读操作:
Get#语句
Get #文件号,[记录号 ],变量。 (可能是重点的内容,和自定义数据类型结合起来考察)。
文件系统控件
驱动器列表框,我们需要修改它的一个属性就是 drive,只能通过程序来修改
文件夹列表框
Private Sub Dir1_Change()
File1.Path = Dir1.Path
End Sub
文件名列表框
Private Sub Drive1_Change()
Dir1.Path = Drive1.Drive
End Sub
文件基本操作
删除文件 kill
Kill 文件名
拷贝文件 filecopy
Filecopy 源文件名 目标文件名
重命名文件(目录 /文件夹) name
Name 原文件名 as 新文件名类型 名称 标 题 其 他窗体 Form1 计算存储在文件中的数据菜单项 Open 打开文件菜单项 Can 进行运算 Enabled=false
菜单项 Save 保存结果 Enabled=false
菜单项 Quit 退出程序通用对话框 Cd1
文本框 Text1 MultiLine=true
Scrollbars=2
在窗体中添加一个通用对话框,设计一个菜单,包括打开文件、进行运算、保存结果和退出程序,要求,在点击打开文件菜单时,使通用对话框的动作是打开文件,选择打开得文件,然后将该文件的内容读出到文本框中,点击进行运算,计算文本框中所有数据相加得结果,然后将结果县实在文本框中,点击保存结果时,
则通过通用对话框将计算结果存储到一个用户自定义的一个文本文件中。
通用模块
Savedata过程:
Dim CD1 As CommonDialog ‘定义全局的通用对话框变量
Sub savedata(str As String)
Set CD1 = Form1.CD1 ‘给 cd1赋值
CD1.Filter = "*.txt|*.txt"
CD1.Action = 2
Open CD1.FileName For Output As #1
Print #1,str
Close
MsgBox "计算结果已经成功保存到 " & CD1.FileName
End Sub
窗体级代码:
Dim numbers(200) As Integer
Dim saveflag As Boolean
Private Sub can_Click()
For i = 1 To UBound(numbers)
s = s + numbers(i)
Next i
Text1.Text = s
End Sub
Private Sub Form_Load()
saveflag = True
End Sub
Private Sub open_Click()
CD1.Filter = "*.txt|*.txt"
CD1.Action = 1
Open CD1.FileName For Input As #1
i = 1
While Not EOF(1)
Input #1,num
numbers(i) = num
Text1.Text = Text1.Text & " " & num
i = i + 1
Wend
Close
can.Enabled = True
save.Enabled = True
End Sub
Private Sub quit_Click()
If saveflag Then
ask = MsgBox("运算结果没有保存! " &
Chr(10) & Chr(13) & "真的要退出吗? ",
vbYesNo + vbQuestion,"保存结果 ")
If ask = vbNo Then
Call savedata(Text1.Text)
End If
End If
End
End Sub
Private Sub save_Click()
Call savedata(Text1.Text)
End Sub
Private Sub Text1_Change()
saveflag = False
End Sub
创建一个随机文件,然后读出其中内容,显示在文本框中:
在窗体中创建一个文本框 text1,两个命令按钮 command1和 command2,点击 command1(写入文件)时创建文件,点击 command2(读出文件)时把文件中的数据读出来,显示在文本框中。下面是程序代码:
自定义数据类型(记录类型,在窗体的通用代码段中声明)
Private Type Record
ID As Integer
Name As String * 20
End Type
创建文件的代码,Command1的单击事件
Private Sub Command1_Click()
Dim MyRecord As Record
Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
For recordnumber = 1 To 5
MyRecord.ID = recordnumber
MyRecord.Name = "My Name" & recordnumber
Put #1,recordnumber,MyRecord
Next recordnumber
Close #1
End Sub
读出文件的代码( Command2的单击事件)
Private Sub Command2_Click()
Dim MyRecord As Record
Open "TESTFILE" For Random As #1 Len
= Len(MyRecord)
While Not EOF(1)
Get #1,,MyRecord
Text1.Text=Text1.Text & Chr(10) & Chr(13)
& Chr(10) & Chr(13) & MyRecord.ID & " "
& MyRecord.Name
Wend
Close #1
End Sub