第11章 Visual Basic的数据文件.docx
《第11章 Visual Basic的数据文件.docx》由会员分享,可在线阅读,更多相关《第11章 Visual Basic的数据文件.docx(18页珍藏版)》请在冰豆网上搜索。
第11章VisualBasic的数据文件
第11章VisualBasic的数据文件
11.1文件概述
文件:
存储在外部介质上的数据的集合。
输入/输出设备也可看作是文件。
每个文件都用唯一的文件全名进行区别。
11.1.1文件结构及用户自定义数据类型
1.文件结构
(1)字符(Character):
是构成文件的最基本单位。
(2)字段(Field):
也称域,由若干个字符组成,用来表示一项数据。
(3)记录(Record):
由一组相关的字段组成。
(4)文件(File):
文件由记录构成,一个文件含有一个以上的记录。
2.用户自定义数据类型
Type语句定义的类型称为记录类型
在标准模块或窗体模块的声明部分中定义,窗体模块中定义的记录类型只能是私有的
格式:
[Public|Private]Type数据类型名
数据元素名As类型名
数据元素名As类型名
……
EndType
例如:
TypeStudent
NumAsInteger
NameAsString
AgeAsInteger
SexAsString*1
ScoreAsSingle
EndType
定义了记录类型后,可以定义属于这种类型的变量,如:
DimStuAsStudent
用“变量名.元素名”引用成员,如:
Stu.Num=20
Stu.Name="zhangqiang"
11.1.2文件种类
(1)根据数据性质:
程序文件、数据文件
(2)根据数据的存取方式和结构:
顺序文件、随机文件
①顺序文件
记录一个接一个地存放。
只能从文件头开始,一个记录一个记录地顺序读取。
②随机存取文件
又称直接存取文件(简称随机文件或直接文件)。
可访问文件中的任一个记录。
每个记录的长度是固定的,记录中的每个字段的长度也是固定的。
每个记录都有一个记录号,按记录号读写。
(3)根据数据的编码方式:
ASCII文件、二进制文件
①ASCII文件
又称文本文件,每个字节放一个ASCII代码。
②二进制文件
以二进制方式保存的文件。
11.2文件的打开与关闭
数据文件的操作步骤:
(1)打开(或建立)文件
(2)进行读、写操作
(3)关闭文件
11.2.1文件的打开
用Open语句打开或建立一个文件
【格式】
Open文件全名[For打开方式][Access存取类型][锁定]As[#]文件号[Len=记录长度]
【功能】分配缓冲区,确定存取方式。
【说明】
①打开方式:
Output顺序输出
Input顺序输入
Append顺序追加
Random随机存取(默认)
Binary二进制
②存取类型:
Read只读
Write只写
ReadWrite读写(随机、二进制、用Append方式打开的文件)
③锁定:
在多用户或多进程环境中使用,用来限制其他用户或进程对文件进行读写操作。
④文件号:
整型表达式。
1~511。
⑤记录长度:
整型表达式。
随机文件的记录长度(默认128字节)。
顺序文件的缓冲字符数(默认512字节)。
顺序文件各个记录的长度可以不相同。
二进制文件忽略Len子句。
【举例】
Open"student.dat"ForOutputAs#1
Open"student.dat"ForAppEndAs#1
Open"student.dat"ForInputAs#1
Open"student.dat"ForRandomAs#1
Open"student.dat"ForRandomAccessReadLockWriteAs#1
Open"c:
\ysxx\student.dat"ForRandomAs#1Len=256
11.2.2文件的关闭
Close语句格式:
Close[[#]文件号][,[#]文件号]……
说明:
(1)文件号是Open语句中使用的文件号。
省略文件号,则关闭所有打开的文件。
(2)关闭的作用:
把缓冲区中的数据写到文件;释放文件号。
(3)除了用Close语句外,程序结束时也将自动关闭所有打开的数据文件。
11.3文件操作语句和函数
11.3.1文件指针
文件指针用来表示文件的读写位置。
用Append方式打开文件时,文件指针指向文件的末尾
用其他方式(Input、Output、Random、Binary等)打开文件时,文件指针指向文件的开始。
每一次读写,指针都自动移动到下一个位置。
随机文件,最小移动单位是一个记录的长度。
顺序文件,移动的长度与读写的字符串的长度相同。
Seek语句:
Seek#文件号,位置
功能:
指针定位
说明:
(1)顺序文件,“位置”是从文件开头开始的字节数。
随机文件,“位置”是下一次读写的记录号。
(2)Get、Put语句中的记录号优先于Seek语句。
Seek函数:
Seek(文件号)
功能:
返回文件指针的当前位置。
例:
Open"d:
\test"ForOutputAs#1'新建test顺序文件,文件指针指向第1字节位置
sName="wangqiang"'变量sName设为字符串
Print#1,sName'sName输出到文件中,文件内容:
wangqiang
modi="l"
Seek#1,6'文件指针指向第6字节位置,即"q"所在位置
Print#1,modi;'modi输出到文件中,文件内容:
wangliang
Currentfilepoint=Seek
(1)'变量Currentfilepoint值为7
Close#1
11.3.2其他语句和函数
1.FreeFile函数
格式:
FreeFile()
功能:
得到一个在程序中没有使用的文件号。
举例:
Filenum=FreeFile()
Open“test”ForOutputAsFilenum
2.Loc函数
格式:
Loc(文件号)
功能:
返回指定文件的当前读写位置。
随机文件,返回最后读写的记录号,即当前读写位置的上一个记录。
顺序文件,返回文件指针当前位置除以128的值。
二进制文件,返回最后一次读写的字节位置。
3.LOF函数
格式:
LOF(文件号)
功能:
返回文件长度。
单位是字节,但要是128的倍数。
因为文件的基本单位是记录,每个记录的默认长度是128字节。
例如:
某个文件的实际长度是257(=128*2+1)个字节,则用LOF函数返回的是384(=128*3)个字节。
4.EOF函数
格式:
EOF(文件号)
功能:
测试是否到达文件末尾。
返回True或False。
11.4顺序文件
11.4.1顺序文件的写操作
1.Print#语句
格式:
Print#文件号,[[Spc(n)|Tab(n)][表达式表][;|,]]
功能:
把数据写入文件。
Print方法所“写”的对象是窗体、打印机或控件。
Print#语句所“写”的对象是文件。
在满足下列条件之一时才写入磁盘:
①关闭文件(Close)
②缓冲区已满
③缓冲区未满,但执行下一个Print#语句
2.Write#语句
格式:
Write#文件号,表达式表
说明:
(1)“表达式表”中的各项以逗号分开。
(2)以紧凑格式存放。
自动在数据项之间插入逗号、给字符串加上双引号、最后项末尾插换行符。
(3)正数的前面没有空格。
【例11.1】编写程序,利用Write#语句向文件中写入数据,建立学生档案文件,程序可以依次输入多个同学的信息,当输入的姓名为“-1”时,结束输入。
步骤:
①新建一个“标准EXE工程”,自动在工程中添加一个名称为Form1的窗体。
②在窗体模块的声明段中定义自定义数据类型student。
PrivateTypestudent
sNameAsString
snoAsString
ageAsInteger
sdormAsString
sphoneAsString
EndType
编写窗体的Click事件过程。
PrivateSubForm_Click()
DimstuAsstudent
Open"d:
\student.dat"ForAppendAs#1
i=1
DoWhilestu.sName<>"-1"
stitle="第"+Str$(i)+"名学生数据输入"
stu.sName=InputBox("请输入姓名:
",stitle)
stu.sno=InputBox("请输入学号:
",stitle)
stu.age=Val(InputBox("请输入年龄:
",stitle))
stu.sdorm=InputBox("请输入宿舍:
",stitle)
stu.sphone=InputBox("请输入电话:
",stitle)
Ifstu.sName<>"-1"Then
Write#1,stu.sName,stu.sno,stu.age,stu.sdorm,stu.sphone
EndIf
i=i+1
Loop
Close#1
EndSub
运行程序
利用记事本打开d:
\student.dat文件
11.4.2顺序文件的读操作
1.Input#语句
格式:
Input#文件号,变量表
说明:
(1)“变量表”由一个或多个变量组成,从数据文件中读出的数据赋给这些变量。
(2)读出的数据,忽略前导空格、回车或换行符。
【例11.2】把前面建立的学生数据文件读到内存,并在屏幕(窗体)中显示出来。
自定义类型同前例
窗体单击事件过程:
PrivateSubForm_Click()
Dimstu()Asstudent
n=Val(InputBox("输入读取人数:
"))
ReDimstu(n)Asstudent
Open"d:
\student.dat"ForInputAs#1
Print"姓名";Tab(10);"学号";Tab(20);"年龄";Tab(30);"宿舍";Tab(40);"电话"
Fori=1Ton
Input#1,stu(i).sName,stu(i).sno,stu(i).age,stu(i).sdorm,stu(i).sphone
Printstu(i).sName;Tab(10);stu(i).sno;Tab(20);stu(i).age;Tab(30);stu(i).sdorm;Tab(40);stu(i).sphone
Nexti
Close#1
EndSub
2.LineInput#语句
格式:
LineInput#文件号,字符串变量
功能:
从顺序文件中读取一行,赋给字符串变量。
【例11.3】把一个磁盘文本文件的内容读到内存并在文本框中显示出来,然后再把该文本框中的内容存入另一个磁盘文件。
步骤:
①新建一个“标准EXE”工程,自动在工程中添加一个名为Form1的窗体。
②在窗体上建立一个文本框,设置MultiLine属性设为True。
③编写如下事件过程:
PrivateSubForm_Click()
Open"d:
\student.dat"ForInputAs#1
DoWhileNotEOF
(1)
LineInput#1,saline$'saline不包括回车换行符
swhole$=swhole$+saline$+Chr$(13)+Chr$(10)'在每行末添上回车换行符
Loop
Text1.Text=swhole$
Close#1
Open"d:
\student2.dat"ForOutputAs#1
Print#1,Text1.Text
Close#1
EndSub
3.Input$函数
格式:
Input$(n,#文件号)
功能:
返回从指定文件中读出的n个字符(二进制输入)。
例:
x$=Input$(100,#1)
从文件号为1的文件中读取100个字符,并把它赋给变量x$。
11.5随机文件
特点:
(1)定长记录,通过记录号确定位置。
(2)每个记录分若干个字段,每个字段的长度等于相应的变量的长度。
(3)各变量(数据项)要按一定的格式置入相应的字段。
(4)打开随机文件后,既可以读也可以写。
11.5.1随机文件的打开与读写操作
1.随机文件的写操作
(1)定义数据类型
(2)打开随机文件
(3)将内存中的数据写入磁盘
Put语句,格式:
Put#文件号,[记录号],变量
说明:
省略“记录号”,写到下一个记录位置,逗号不能省。
②记录长度与数据的长度应匹配。
(4)关闭文件
2.随机文件的读操作
Get语句,格式:
Get#文件号,[记录号],变量
【例11.4】建立并读取一个学生信息随机文件。
步骤:
(1)新建一个“标准EXE”工程,自动在工程中添加一个名为Form1的窗体。
(2)执行“工程”菜单中的“添加模块”命令,建立标准模块,在该模块中定义如下的记录类型:
Typestudent
sNameAsString*8'姓名字段为定长字符串,长度为8
snoAsString*7'学号字段为定长字符串,长度为7
ageAsInteger'年龄字段
sdormAsString*5'宿舍字段
sphoneAsString*11'电话字段
EndType
(3)在窗体中添加3个命令按钮:
建立文件、显示全部记录、显示指定记录。
(4)分别编写3个命令按钮的Click事件过程代码。
PrivateSubCommand1_Click()'建立学生信息数据文件
DimstuAsstudent,reclenAsInteger,recnoAsInteger
reclen=Len(stu)'计算记录的长度
Open"studentr.dat"ForRandomAs#1Len=reclen
recno=1
DoWhileTrim(stu.sName)<>"-1"
stitle="第"+Str(recno)+"名学生数据输入"
stu.sName=Trim(InputBox("请输入姓名:
",stitle))
stu.sno=Trim(InputBox("请输入学号:
",stitle))
stu.age=Val(InputBox("请输入年龄:
",stitle))
stu.sdorm=Trim(InputBox("请输入宿舍:
",stitle))
stu.sphone=Trim(InputBox("请输入电话:
",stitle))
IfTrim(stu.sName)<>"-1"Then
Put#1,recno,stu
recno=recno+1
EndIf
Loop
Close#1
EndSub
PrivateSubCommand2_Click()'显示文件中的全部记录
DimiAsInteger,numbersAsInteger,reclenAsInteger,stuAsstudent
reclen=Len(stu)'计算记录的长度
Open"studentr.dat"ForRandomAs#1Len=reclen
Cls
numbers=LOF
(1)/reclen'计算记录的数目
Print"姓名";Tab(10);"学号";Tab(20);"年龄";Tab(30);"宿舍";Tab(40);"电话"
Fori=1Tonumbers'逐条读出记录并输出
Get#1,i,stu
Printstu.sName;Tab(10);stu.sno;Tab(20);stu.age;Tab(30);stu.sdorm;Tab(40);stu.sphone
Nexti
Close#1
EndSub
PrivateSubCommand3_Click()'显示文件中指定的记录
DimiAsInteger,numbersAsInteger,reclenAsInteger,stuAsstudent
reclen=Len(stu)
Open"studentr.dat"ForRandomAs#1Len=reclen
Cls
numbers=LOF
(1)/reclen
i=Val(InputBox("请输入记录号:
","数据输入"))
Ifi<1Ori>numbersThen
MsgBox"记录号超出范围"
Else
Print"姓名";Tab(10);"学号";Tab(20);"年龄";Tab(30);"宿舍";Tab(40);"电话"
Get#1,i,stu'读取指定的记录
Printstu.sName;Tab(10);stu.sno;Tab(20);stu.age;Tab(30);stu.sdorm;Tab(40);stu.sphone
EndIf
Close#1
EndSub
11.5.2随机文件中记录的增加与删除
1.增加记录
利用随机文件长度/记录长度求出记录个数
将记录数加1,Put语句写数据
2.删除记录
把下一个记录重写到要删除的记录位置上
其后的所有记录依次前移
【实验】在例11.4的软件中增加添加记录、删除记录功能。
11.6文件系统控件
VB工具箱的三个控件:
驱动器列表框(DriveListBox)
目录列表框(DirectoryListBox)
文件列表框(FileListBox)
1.驱动器列表框
Drive属性:
返回或设置当前驱动器的名称
只能用程序设置该属性
Change事件:
从驱动器列表框中选择一个新的驱动器时,触发该事件
2.目录列表框
Path属性:
返回或设置当前路径
只能在程序代码中设置
【格式】[窗体.]目录列表框名称.Path[=“路径”]
【例如】PrintDir1.Path显示当前路径
Dir1.Path=“d:
\vb”设置路径
Change事件:
Path属性值改变时,触发该事件
3.文件列表框
Path属性:
同目录列表框
Pattern属性:
用来设置在执行时要显示的某一种类型的文件
属性窗口、程序代码均可设置
默认值为*.*(所有文件)
【代码格式】[窗体.]文件列表框名.Pattern[=属性值]
【例如】PrintFile1.Pattern显示Pattern属性值
File1.Pattern=“*.bmp”只显示扩展名为“.bmp”的文件
FileName属性:
设置或返回某一选定的文件名称
可以用它来设置Path或Pattern属性
【代码格式】[窗体.]文件列表框名.FileName[=文件名]
【例如】File1.FileName=“d:
\vbe\*.exe”
显示d:
\vbe目录下扩展名为.exe的文件
File1的Path属性值设置为“d:
\vbe”
Pattern属性值设置为“*.exe”
4.驱动器列表框、目录列表框、文件列表框的同步操作
PrivateSubDrive1_Change()
Dir1.Path=Drive1.Drive
EndSub
PrivateSubDir1_Change()
File1.Path=Dir1.Path
EndSub
【例11.5】设计一个窗体,利用文件系统控件来选择查看一个图象文件。
步骤:
①新建一个“标准EXE”工程,自动在工程中添加一个名为Form1的窗体。
②向窗体中添加1个驱动器列表框、1个目录列表框、1个文件列表框、2个标签和1个图象框。
③编写代码:
PrivateSubForm_Load()
File1.Pattern="*.jpg"
EndSub
PrivateSubDrive1_Change()
Dir1.Path=Drive1.Drive
EndSub
PrivateSubDir1_Change()
File1.Path=Dir1.Path
EndSub
PrivateSubFile1_Click()
DimFileDirAsString
IfRight(File1.Path,1)="\"Then
FileDir=File1.Path&File1.FileName
Else'文件不在驱动器根目录时
FileDir=File1.Path&"\"&File1.FileName'形成全文件名
EndIf
Label1.Caption="File1.Path="&File1.Path'显示文件所在路径
Label2.Caption="File1.FileName="&File1.FileName'显示文件名
Image1.Picture=LoadPicture(FileDir)'将选中的图片文件显示在Image1中
EndSub
11.7文件基本操作
1.删除文件(Kill语句)
格式:
Kill文件名
例如:
Kill"c:
\wd\*.bak"
2.拷贝文件(FileCopy语句)
格式:
FileCopy源文件名,目标文件名
例如:
FileCopy"student.dat","stu.dat"
FileCopy"d:
\vbe\student.dat","d:
\stu.dat"
3.文件(目录)重命名(Name语句)
格式:
Name原文件名As新文件名
例如:
Name"student.dat"As"student.txt"重命名文件
Name"c:
\dos\unzip.exe"As"c:
\windows\unzip.exe"移动文件
Name"c:
\temp"As"c:
\tempold"重命名目录
注意:
不能跨驱动器移动文件
如果文件已经打开,不能重命名