第13章数据文件本章内容及要求1Word格式文档下载.docx
《第13章数据文件本章内容及要求1Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第13章数据文件本章内容及要求1Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
二进制文件(Binaryfile)是字节的集合、它直接把二进制码存放在文件中。
除了没有数据类型或者记录长度的含义以外,它与随机访问很相似。
二进制访问模式是以字节数来定位数据,在程序中可以按任何方式组织和访问数据,对文件中各字节数据直接进行存取。
13.1.3
文件的基本操作
虽然这3种文件访问的数据类型不同,但应用程序访问它们的步骤却相似:
①使用Open语句打开文件,并为文件指定一个文件号。
对文件进行任何I/O操作之前,都必须经过这步操作。
②从文件中读取部分或全部数据到内存变量中。
③对变量中的数据进行处理。
④将处理后的数据保存回文件中。
⑤使用Close语句关闭文件。
如果没有关闭文件,则会导致文件中部分或全部信息丢失。
13.2顺序文件的基本操作
在程序中对文件的操作,通常按3个步骤进行:
一、顺序文件的打开与关闭
13.2.1打开文件
打开文件用语句open,其格式为:
Open“文件名”[For模式]As[#]文件号[Len=记录长度]
(1)模式
OUTPUT:
写操作
INPUT:
读操作
APPEND:
追加到文件未尾
例如:
"
C:
\VB\SCORE.txt"
FOROUTPUTAS#1
(2)文件号
1~511,可以用FreeFile函数获得下一个可利用的文件号。
(3)记录长度
小于或等于32767的整数,它指定数据缓冲区的大小。
例如,打开C:
\VB\SCORE,供写入数据,指定文件号为#1。
OPEN“C:
\VB\score”FORoutputAS#1
\TEMP\A.TXT”FORInputAS#1
OPEN“C:
\TEMP\B.TXT”FOROutputAS#2
\TEMP\C.TXT”FORAppendAS#1
13.2.2顺序文件的读写操作
1.写操作
向文件写入内容使用Print#语句或Write#语句,在程序中是数据输出。
(1)Print语句
语法格式:
PRINT#<
文件号>
,[<
输出列表>
]
说明:
文件号为以写方式打开文件的文件号;
输出列表为用分号或逗号分隔的变量、常量、空格和定位函数序列。
(2)Write命令
Write#<
Write语句采用紧凑格式。
数据项之间插入“,”,并给字符数据加上双引号。
例子3-1Print与Write语句输出数据结果比较。
PrivateSubForm_Click()
DimStrAsString,AnumAsInteger
Open"
D:
\Myfile.dat"
ForoutputAs1
Str="
ABCDEFG"
Anum=12345
Print#1,Str,Anum
Write#1,Str,Anum
Close#1
EndSub
例13-2编程把一个文本框中的内容,以文件形式存入磁盘。
假定文本框的名称为Mytxt,文件名为Myfile.dat。
方法1:
把整个文本框的内容一次性地写入文件。
PrivateSubCommand1_Click()
c:
ForOutputAs#1
Print#1,mytxt.Text
Close#1
方法2:
把整个文本框的内容一个字符一个字符地写入文件。
PrivateSubCommand1_Click()
PrivateSubCommand2_Click()
Myfile.dat"
Fori=1ToLen(mytxt.Text)
Print#1,Mid(mytxt.Text,i,1);
Nexti
2.顺序文件读操作
从现存文件中向内存读入数据,应以Input方式打开该文件。
然后使用Input#语句、LineInput#语句和Input()函数读入到程序变量中。
使用格式如下:
INPUT#文件号,变量列表
把读出的每个数据项分别存放到所对应的变量。
LINEINPUT#文件号,字符串变量
读一行到变量中,主要用来读取文本文件。
INPUT$(读取字符数,#文件号)
读取指定的数量的字符,作为函数的返回值。
例13-3把datain.txt的文本文件中的数据按5行5列的格式显示在窗体上。
OptionBase1
ConstN=5
ConstM=5
Dimmat(M,N)
Dimi,j
d:
\datain.dat"
ForInputAs#1
Fori=1ToN
Forj=1ToN
Input#1,mat(i,j)
Nextj
Nexti
Print
Print"
初始矩阵为:
"
PrintTab(5*j);
mat(i,j);
左上——右下对角线上元素为:
PrintTab(5*i);
mat(i,i);
例13-4读取文本文件到文本框。
DiminputdataAsString*1
Text1.Text="
\myfile1.txt"
DoWhileNotEOF
(1)
LineInput#1,inputdata
Text1.Text=Text1.Text+inputdata+vbCrLf
Loop
DimfilelengthAsLong
\myfile2.txt"
Text1.Text=Input(140,#1)
PrivateSubCommand3_Click()
\myfile3.txt"
inputdata=Input(1,#1)
Text1.Text=Text1.Text+inputdata
13.2.3关闭文件——Close语句
Close[文件号列表]
其中:
文件号列表为可选项,如:
#1,#2,#3,如果省略,则将关闭Open语句打开的所有活动文件。
Close#1,#2,#3
Close
13.2.4与读文件操作有关的几个函数
(1)Lof函数
LOF函数将返回某文件的字节数。
例如,LOF
(1)返回#1文件的长度,如果返回0值,则表示该文件是一个空文件。
(2)Loc函数
Loc函数将返回在一个打开文件中读写的记录号;
对于二进制文件,它将返回最近读写的一个字节的位置。
(3)Eof函数
Eof函数将返回一个表示文件指针是否到达文件末尾的标志。
如果到了文件末尾,Eof函数返回TRUE(-1),否则返回FALSE(0)。
语法结构:
DoWhileNotEof(文件号)
语句
Loop
(4)FileLen函数
此函数返回指定文件的文件长度。
调用格式为:
FileLen(文件名)
(5)FreeFile[(范围)]
此函数获得尚未被战用的文件号中的第一个,参数可以是0或1。
例13-5某商店商品数据。
\goods.txt"
ForAppendAs#1
Print#1,Text1.Text,Text2.Text,Text3.Text,Text4.Text,Text5.Text
msg=MsgBox("
保存完毕,继续输入商品信息吗?
vbYesNo+vbQuestion)
Ifmsg=6Then
Text2.Text="
Text3.Text="
Text4.Text="
Text5.Text="
EndIf
Text7.Text="
LineInput#1,x
Text7.Text=Text7.Text+x+Chr(13)+Chr(10)
Close
13.3随机文件的操作
在文件中以顺序文件方式进行存取数据很方便也很常用,但是当需要大量查找或修改文件中的数据时会很困难,而这时采用随机文件方式存取数据就显得比较方便。
随机文件的每一个数据项都有相同的长度,它的数据项通常称做记录。
随机文件是以记录为单位的,每条记录都被赋予了记录号以便查找。
应用程序可以根据记录号直接读取随机文件中的任意记录,而无须由前至后逐个读取记录。
对随机文件的存取是以记录为单位进行的,每个记录包括一个或多个字段。
具有一个字段的记录对应于任一标准类型,比如整数或定长字符串。
具有多个字段的记录对应于用户自定义类型。
13.3.1打开(建立)文件
1、声明记录类型变量
在打开一个文件进行随机访问之前,应定义一个类型,该类型对应于该文件包含或将包含的记录。
语法格式为:
[Private|Public]Type自定义类型名
元素名Astype
[元素名Astype]
…
EndType
例如,声明一个学生自定义类型。
TypeStudent
NumberAsString2(学号,宽度为2字节)
NameAsString8(姓名,宽度为8字节)
ScoreAsInteger(成绩,宽度为2字节)
EndType
在定义与记录对应的类型以后,应接着声明程序需要的任何其他变量,用来处理作为随机访问而打开的文件。
如:
Publicstudent1,student2Asstudent(定义记录变量)
PublicstnumeAsInteger(定义存放当前记录号的变量)
PublicLastRecordAsLong(存放最后一条记录的编号)
13.3.2随机文件的读写操作
1.打开文件
格式:
文件名"
ForRandomAs#文件号[Len=记录长度]
2.读操作
Get[#]文件号,[记录号],变量名
功能:
将一个已打开的磁盘文件的一条记录的内容读入一个变量之中。
忽略记录号,则读出当前记录后的那一条记录。
13.3.3随机文件的增、删、改(写操作)
写操作的格式为:
Put[#]文件号,[记录号],变量名
功能是将一个变量的数据写入磁盘文件中,将一个记录变量的内容写到指定的记录位置处。
忽略记录号,则表示在当前记录后的位置插入一条记录。
1.添加记录
在随机文件里添回记录,实际上是在文件尾增加一条记录。
用下面的方法可以找到随机文件的记录数:
记录数LOF(文件号)/len(记录型变量)
如果一个文件的记录数是num,则用下面的语句可以增加一条记录:
num=num+1
put#2,num,x
2.删除记录
要删除一个记录的所有字段可以通过删除记录实现,但该记录仍然在文件中存在,所以一般是把剩余记录复制,之后删除文件。
例13-5a创建一个随机文件,然后读出其中内容,显示在文本框中:
在窗体中创建一个文本框text1,两个命令按钮command1和command2,点击command1(写入文件)时创建文件,点击command2(读出文件)时把文件中的数据读出来,显示在文本框中。
下面是程序代码:
自定义数据类型(记录类型,在窗体的通用代码段中声明)
PrivateTypeRecord
IDAsInteger
NameAsString*20
EndType
创建文件的代码,Command1的单击事件
DimMyRecordAsRecord
Open"
TESTFILE"
ForRandomAs#1Len=Len(MyRecord)
Forrecordnumber=1To5
MyRecord.ID=recordnumber
MyRecord.Name="
MyName"
&
recordnumber
Put#1,recordnumber,MyRecord
Nextrecordnumber
读出文件的代码(Command2的单击事件)
DimMyRecordAsRecord
WhileNotEOF
(1)
Get#1,,MyRecord
Text1.Text=Text1.Text&
Chr(10)&
Chr(13)&
MyRecord.ID&
MyRecord.Name
Wend
例13-6设计一个简单教师信息管理程序,使用随机文件存储教师信息。
PrivateTypeteacher
teachNoAsString*2
teachnameAsString*8
teachsexAsString*2
teachageAsString*2
teachzhcAsString*8
teachxlAsString*10
DimteachinfoAsteacher
DimlastrecAsInteger
\info.txt"
ForRandomAs#1Len=Len(teachinfo)
lastrec=LOF
(1)/Len(teachinfo)
Withteachinfo
.teachNo=Text1.Text
.teachname=Text2.Text
.teachsex=Text3.Text
.teachage=Text4.Text
.teachzhc=Text5.Text
.teachxl=Text6.Text
EndWith
Put#1,lastrec+1,teachinfo
i=InputBox("
请输入查询的记录号"
)
Ifi<
0Ori>
lastrecThen
MsgBox"
请输入1到"
lastrec&
之间的数"
vbOKOnly+vbInformation
Else
Get#1,i,teachinfo
Text1.Text=teachinfo.teachNo
Text2.Text=teachinfo.teachname
Text3.Text=teachinfo.teachsex
Text4.Text=teachinfo.teachage
Text6.Text=teachinfo.teachzhc
Text6.Text=teachinfo.teachxl
End
二进制文件是一个字节流,文件系统并不解释各字节的意义,解释工作由具体的应用程序完成。
以二进制方式访问文件有下述特点:
可以直接访问文件中的所有数据。
由应用程序根据需要解释数据的意义。
访问文件的语句不更改原始数据的所有内容。
二进制文件每一次读写是以字节为单位对数据进行访问操作的,它允许用户读写或修改文件中的任何字节信息。
当把二进制数据写入文件中时,使用Byte数据类型的数组,而不是String变量。
String被认为包含的是字符,而二进制型数据可能无法正确地存储在String变量中。
当要保持文件的尺寸尽量小时,应使用二进制文件。
13.4二进制文件
13.4.1二进制文件的打开
ForBinaryAs#文件号
13.4.2二进制文件的读写操作
1.写操作
Put[#]文件号,[位置],变量名
写入长度等于变量长度的数据。
2.二进制文件的读操作
GET[#]文件号,[位置],变量名
从指定位置开始读出长度等于变量长度的数据存入变量中,数据读出后移动变量长度位置,如果忽略位置,则表示从文件指针所指的位置开始读出数据,数据读出后移动变量长度位置。
例13-7从位置800起写一个字符串“5678”,从位置1200起写一个字符串“VisualBasic程序设计方法”。
FileNumber=FreeFile
\rest.dat"
ForBinaryAsFileNumber
const1="
5678"
const2="
VisualBasic程序设计方法"
Put#FileNumber,800,const1
Put#FileNumber,1200,const2
Close#FileNumber
例13-7a文件复制
DimcharAsByte
DimFileNum1,FileNum2AsInteger
FileNum1=FreeFile
\rest.DAT"
ForBinaryAs#FileNum1
'
打开源文件
FileNum2=FreeFile
\rest.BAK"
ForBinaryAs#FileNum2
打开目标文件
DoWhileNotEOF(FileNum1)
Get#1,,char'
从源文件读出一个字节
Put#2,,char'
将一个字节写入目标文件
Close#FileNum1
Close#FileNum2
13.4.3Seek函数与Seek语句
1.函数
Seek(filenumber)
必要的filenumber参数是一个包含有效文件号的Integer。
说明
Seek函数返回介于1和2,147,483,647(相当于2^31
–
1)之间的值。
2.语句
seek(文件号,recnumber).
13.5文件操作语句
1.ChDir语句
格式:
ChDirpath
功能:
改变当前目录。
例如:
ChDir"
\TMP
2.ChDrive语句
ChDrivedrive
改变当前驱动器
说明:
如果drive为“”,则当前驱动器将不会改变;
如果drive中有多个字符,则ChDrive只会使用首字母。
3.MkDir语句
MkDirpath
创建一个新的目录。
4.RmDir语句
RmDirpath
删除一个存在的目录
只能删除空目录。
5.FileCopy语句
FileCopysource,destination
复制一个文件。
FileCopy语句不能