实验H数据文件.docx
《实验H数据文件.docx》由会员分享,可在线阅读,更多相关《实验H数据文件.docx(17页珍藏版)》请在冰豆网上搜索。
实验H数据文件
实验H数据文件
一、实验目的
1.掌握顺序文件、随机文件及二进制文件的特点和使用。
2.掌握各类文件的打开、关闭和读/写操作。
3.学会在应用程序中使用文件。
二、实验内容
1.编写如图H.1所示的应用程序。
若单击“建立文件”按钮,则分别用Print#和Write#语句将三个同学的学号、姓名和成绩写入文件Score.dat和Scorel.dat;若单击“读取文件”按钮,则用LineInput语句按行将两个文件中的数据送往相应的文本框。
要求:
学号和姓名是字符串类型,成绩是整型。
PrivateSubCommand1_Click()
Open"C:
\Users\Administrator\Desktop\第八章\H1\score"ForOutputAs#1
Print#1,"051023","王海涛",66
Print#1,"052498","周文英",88
Print#1,"050992","陈建东",77
Open"C:
\Users\Administrator\Desktop\第八章\H1\score1"ForOutputAs#2
Write#2,"051023","王海涛",66
Write#2,"052498","周文英",88
Write#2,"050992","陈建东",77
Close
i1=Shell("NOTEPAD.exe"+"c:
\score",vbNormalNoFocus)
i2=Shell("NOTEPAD.exe"+"c:
\score1",vbNormalNoFocus)
EndSub
PrivateSubCommand2_Click()
DimnoAsString,nameAsString,sAsInteger
Open"C:
\Users\Administrator\Desktop\第八章\H1\score"ForInputAs#1
DoWhileNotEOF
(1)
LineInput#1,linedata
List1.AddItemlinedata
Loop
Open"C:
\Users\Administrator\Desktop\第八章\H1\score1"ForInputAs#2
DoWhileNotEOF
(2)
Input#2,no,name,s
List2.AddItemno&name&s
Loop
Close
EndSub
2.将斐波那契数列的前10项写入文件Fb.dat,然后从该文件将数据读取出来并计算合计和平均数,最后送入列表框。
要求:
文件数据格式如图H.2所示,列表框中项目格式如图H.3所示。
PrivateSubCommand1_Click()
Dimfib%(0To9),i%
Open"C:
\Users\Administrator\Desktop\第八章\H2\Fb.dat"ForOutputAs#1
Fori=0To9
Ifi=0Ori=1Then
fib(i)=i
Else
fib(i)=fib(i-1)+fib(i-2)
EndIf
Print#1,"""Fib("&i&")"","&fib(i)
Nexti
Close#1
i=Shell("NOTEPAD.exe"+"C:
\Users\Administrator\Desktop\第八章\H2\Fb.dat",vbNormalNoFocus)
Close#1
EndSub
PrivateSubCommand2_Click()
Dimst$,n%,sum%
Open"C:
\Users\Administrator\Desktop\第八章\H2\Fb.dat"ForInputAs#1
DoWhileNotEOF
(1)
Input#1,st,n
sum=sum+n
List1.AddItemst&"="&n
Loop
Close#1
List1.AddItem"合计:
"&sum
List1.AddItem"平均:
"&sum/10
EndSub
3.设计一个如图H.4所示的应用程序。
要求:
1单击“打开文件”按钮弹出一个通用对话框,选择文件后显示在文本框中。
2单击“保存文件”按钮后弹出通用对话框,确定文件名后保存。
3单击“查找下一个”按钮后在文本文件中查找单词“VB”,找到后以高亮度显示。
若再单击“查找下一个”按钮,则继续查找。
PrivateSubCommand1_Click()
CommonDialog1.Action=1
Text1.Text=""
OpenCommonDialog1.FileNameForInputAs#1
DoWhileNotEOF
(1)
LineInput#1,inputdata
Text1.Text=Text1.Text+inputdata+vbCrLf
Loop
Close#1
EndSub
PrivateSubCommand2_Click()
CommonDialog1.FileName="Default.Txt"
CommonDialog1.DefaultExt="Txt"
CommonDialog1.Action=2
OpenCommonDialog1.FileNameForOutputAs#1
Print#1,Text1.Text
Close#1
EndSub
PrivateSubCommand3_Click()
Staticj%
Text1.SetFocus
j=InStr(j+1,Text1,"VB")
Ifj>0Then
Text1.SelStart=j-1
Text1.SelLength=2
j=j+1
Else
MsgBox"找不到"
EndIf
EndSub
PrivateSubCommand4_Click()
End
EndSub
4.编写一个随机文件程序。
要求:
1建立一个具有5个学生的学号、姓名和成绩的随机文件(Random.dat)。
2读出Random.dat文件中的内容,然后按成绩排序,最后按顺序写入另一个随机文件(Randoml.dat)。
3再一次读出文件的内容,按文件中的顺序将学生的信息显示在屏幕上,检查正确性。
PrivateTypeStudtype
noAsString*4
nameAsString*6
markAsSingle
EndType
DimStudentAsStudtype,Stud(1To5)AsStudtype,tAsStudtype
PrivateSubCommand1_Click()
Open"C:
\Users\Administrator\Desktop\第八章\H4\score.dat"ForRandomAs#1Len=Len(Student)
WithStudent
.no="0001"
.name="小王"
.mark=66
EndWith
Put#1,1,Student
WithStudent
.no="0002"
.name="俊杰"
.mark=99
EndWith
Put#1,2,Student
WithStudent
.no="0003"
.name="勇气"
.mark=88
EndWith
Put#1,3,Student
WithStudent
.no="0004"
.name="光明"
.mark=55
EndWith
Put#1,4,Student
WithStudent
.no="0005"
.name="加油"
.mark=77
EndWith
Put#1,5,Student
Close#1
EndSub
PrivateSubCommand2_Click()
Open"C:
\Users\Administrator\Desktop\第八章\H4\score.dat"ForRandomAs#1Len=Len(Student)
Fori=1To5
Get#1,i,Student
PrintStudent.no,Student.name,Student.mark
Stud(i)=Student
Nexti
Close#1
Fori=1To5
Forj=i+1To5
IfStud(i).mark>Stud(j).markThent=Stud(i):
Stud(i)=Stud(j):
Stud(j)=t
Next
Nexti
Open"C:
\Users\Administrator\Desktop\第八章\H4\score.dat"ForRandomAs#2Len=Len(Student)
Fori=1To5
Put#2,i,Stud(i)
Nexti
Close#1
EndSub
PrivateSubCommand3_Click()
Open"C:
\Users\Administrator\Desktop\第八章\H4\score.dat"ForRandomAs#1Len=Len(Student)
Fori=1To5
Get#1,i,Stud(i)
PrintStud(i).no;Stud(i).name;Stud(i).mark
Nexti
Close#1
EndSub
5.在教材例8.6中添加一组按钮,如图H.5所示,并编写事件过程。
DimStudentAsStudType
DimRecord_NoAsInteger
SubCommand1_Click()
WithStudent
.iNo=Val(Text1.Text)
.strName=Text2.Text
.strSex=IIf(Option1.Value,"1","0")
.sMark=Val(Text4.Text)
EndWith
Open"C:
\Users\Administrator\Desktop\第八章\H5\STUDENT.DAT"ForRandomAs#1Len=Len(Student)
Record_No=LOF
(1)/Len(Student)+1
Label4.Caption=Record_No
Put#1,Record_No,Student
Close#1
EndSub
SubCommand2_Click()
Open"C:
\Users\Administrator\Desktop\第八章\H5\STUDENT.DAT"ForRandomAs#1Len=Len(Student)
Record_No=Val(Text3.Text)
Get#1,Record_No,Student
Text1.Text=Student.iNo
Text2.Text=Student.strName
IfStudent.strSex="1"Then
Option1.Value=True
Else
Option2.Value=True
EndIf
Text4.Text=Student.sMark
Record_No=LOF
(1)/Len(Student)
Close#1
EndSub
PrivateSubCommand3_Click()
Open"C:
\Users\Administrator\Desktop\第八章\H5\STUDENT.DAT"ForRandomAs#1Len=Len(Student)
Record_No=1
Get#1,Record_No,Student
Text1.Text=Student.iNo
Text2.Text=Student.strName
IfStudent.strName="1"Then
Option1.Value=True
Else
Option2.Value=True
EndIf
Text4.Text=Student.sMark
Close#1
EndSub
PrivateSubCommand4_Click()
Open"C:
\Users\Administrator\Desktop\第八章\H5\STUDENT.DAT"ForRandomAs#1Len=Len(Student)
Record_No=Record_No+1
Get#1,Record_No,Student
Text1.Text=Student.iNo
Text2.Text=Student.strName
IfStudent.strName="1"Then
Option1.Value=True
Else
Option2.Value=True
EndIf
Text4.Text=Student.sMark
Close#1
EndSub
PrivateSubCommand5_Click()
Open"C:
\Users\Administrator\Desktop\第八章\H5\STUDENT.DAT"ForRandomAs#1Len=Len(Student)
Record_No=Record_No-1
Get#1,Record_No,Student
Text1.Text=Student.iNo
Text2.Text=Student.strName
IfStudent.strName="1"Then
Option1.Value=True
Else
Option2.Value=True
EndIf
Text4.Text=Student.sMark
Close#1
EndSub
PrivateSubCommand6_Click()
Open"C:
\Users\Administrator\Desktop\第八章\H5\STUDENT.DAT"ForRandomAs#1Len=Len(Student)
Record_No=Val(Label4.Caption)
Get#1,Record_No,Student
Text1.Text=Student.iNo
Text2.Text=Student.strName
IfStudent.strName="1"Then
Option1.Value=True
Else
Option2.Value=True
EndIf
Text4.Text=Student.sMark
Close#1
EndSub
SubCommand7_Click()
WithStudent
.iNo=Val(Text1.Text)
.strName=Text2.Text
.strSex=IIf(Option1.Value,"1","0")
.sMark=Val(Text4.Text)
EndWith
Open"C:
\Users\Administrator\Desktop\第八章\H5\STUDENT.DAT"ForRandomAs#1Len=Len(Student)
Record_No=Val(Text4.Text)
Put#1,Record_No,Student
Close#1
EndSub
SubForm_Load()
Open"C:
\Users\Administrator\Desktop\第八章\H5\STUDENT.DAT"ForRandomAs#1Len=Len(Student)
Label4.Caption=LOF
(1)/Len(Student)
Close#1
EndSub
6.将教材例8.4用随机文件实现。
PrivateTypestudtype
noAsInteger
nameAsString*6
markAsInteger
EndType
DimstdAsstudtype
DimrecordAsInteger
PrivateSubCommand1_Click()
Withstd
.no=Val(Text1.Text)
.name=Text2.Text
.mark=Val(Text3.Text)
EndWith
Open"C:
\Users\Administrator\Desktop\第八章\H6\score1"ForRandomAs#1Len=Len(std)
record=LOF
(1)/Len(std)+1
Put#1,record,std
Close#1
Text1.Text=""
Text2.Text=""
Text3.Text=""
Text1.SetFocus
EndSub
PrivateSubCommand2_Click()
Dimsum,countAsInteger
Open"C:
\Users\Administrator\Desktop\第八章\H6\score1"ForRandomAs#1Len=Len(std)
Fori=1Torecord
Get#1,i,std
sum=sum+std.mark
count=count+1
List1.AddItemstd.no&""&std.name&std.mark
Nexti
List1.AddItem"总分"&sum
List1.AddItem"平均成绩"&sum/count
Close#1
EndSub
7.编写一个能将任意两个文件的内容合并的程序,程序界面由自己设计。
提示:
若要处理任意类型的文件,则文件必须作为二进制文件打开。
PrivateSubCommand1_Click()
DimcharAsByte
Open"C:
\Users\Administrator\Desktop\第八章\H7\t1.dat"ForBinaryAs#1
Open"C:
\Users\Administrator\Desktop\第八章\H7\t2.dat"ForBinaryAs#2
Open"C:
\Users\Administrator\Desktop\第八章\H7\t3.dat"ForBinaryAs#3
DoWhileNotEOF
(1)
Get1,,char
Put3,,char
Loop
DoWhileNotEOF
(2)
Get2,,char
Put3,,char
Loop
Close#1,#2,#3
EndSub
习题八
l、什么是文件?
ASCII文件与二进制文件有什么区别?
答:
文件是存储在外存储器(如磁盘)上的用文件名称标识的数据的集合。
按存储信息的形分类,文件可分为ASCII文件和二进制文件。
ASCII文件存放的是各种数据的ASCII代码,可以用记事本打开;二进制文件存放的是各种数据的二进制代码,不能用记事本打开,必须由专用程序打开。
2、根据文件的访问模式,文件可分为哪几种类型?
答:
根据文件的访问模式,文件可分为顺序文件、随机文件、二进制文件。
顺序文件要求按顺序访问文件中的数据;随机文件可以根据记录号直接访问某一特定记录;二进制文件要求以字节为单位定位数据位置,允许程序直接访问各个字节数据,也允许程序按所需的任何方式组织和访问数据。
3、构造满足下列条件的Open语句。
(1)建立一个新的顺序文件Seqnew.dat.供用户写入数据,指定文件号为1。
答:
Open”Seqnew.dat”ForOutputAs#1
(2)打开一个旧的顺序文件Seqold.dat,用户将从该文件读出数据,指定文件号为2。
答:
Open”Seqold.dat”ForIntputAs#2
(3)打开一个旧的顺序文件Seqappend.dat,用户将在该文件后面添加数据,文件号调用FreeFile函数获得。
答:
DimNo%
No=FreeFile
Open”Seqappend.dat”ForAppendAs#No
4、试写出程序代码片段,将文本文件Text.dat中的内容读入变量strTest$中。
答:
文本文件具有行结构的特性,可以按行读取文本文件中的数据:
Open"Text.dat"ForInputAs#1
strtest$=""
DoWhileNotEOF
(1)
LineInput#1,linedata
strtest$=strtest$+linedata+vbCrLf
Loop
Close#1
5、Print#和Write#语句的区别?
各有什么用途?
答:
两种语句区别是:
用Write#语句输出数据时,各数据之间自动插入“,”,并给字符串加上双引号,以区别数据类型;而用Print#语句输出数据时,数据项之间既无逗号分隔,字符串又无双引号引起。
因此,为了以后读取数据项的方便,输出列表有多个数据项组成时,建议使用Write#语句。
6、试说明EOF函数的功能