不得不写点VB程序

原创 2005年05月22日 13:06:00
  • 文本文件的操作
 
此种方式是以行为单位进行读取的基本单位,主要应用的方法和函数有Open,Close,Line Input,FreeFile,EOF等。下面先简述其功能然后结合代码示例进行说明。
Open:顾名思义,它的作用是打开文件,换而言之打开某个文件就是获得某个的控制权,一般情况下当文件处于打开状态时只有打开者才能对它进行操作。打开文件时要指定一个整数作为文件号,以后的操作都是针对这个代号进行的,而不是针对文件名。文件号也叫句柄,在程序中一个文件号只能指向一个文件,不能出现两个文件同时具有相同句柄的情况。
Close:关闭文件,即释放文件的控制权。
Line Input:以行为单位取得文件内容,以行为单位是指从当前位置开始到下一个换行符为止的内容。换行符是Chr(13) & Chr(10)两个字节组成,VB中已定义了常量vbCrLf,可直接使用。要注意的是Line Input读取一行时会把行尾的换行符去掉,因此我们在读取每行内容时要记得补上换行符才能保持得到的内容与文件一致。
FreeFile:得到空闲的文件号,用这个函数取得文件号可以避免文件号的冲突。
例如:
    Dim strFileName As String '文件名
    Dim lngHandle As Long '文件句柄
    Dim strAll As String '所读取的文本文件的所有内容
    Dim strLine As String '在循环中存放每行的内容
   
    strFileName = "c:/b.txt"
   
    '获得文件的句柄
    lngHandle = FreeFile()
   
    'For后面的参数表示以何种方式打开文件,Input是读取,Output是覆盖写入,Append是追加写入
    Open strFileName For Input As lngHandle
   
    '循环直到文件尾
    Do While Not EOF(lngHandle)
        '每次读取一行存放在strLine变量中
        Line Input #lngHandle, strLine
        '每次读取都把所读到的内容连接到strAll变量,由于Line Input去掉了换行符,所以这里补上
        strAll = strAll & strLine & vbCrLf
    Loop
   
    '显示得到的全部分内容
MsgBox strAll, vbInformation
 
 
    对文本文件的写入相对简单些,有三个步骤:打开文件,写入文本,关闭文件。
代码示例:
    Dim strFileName As String '文件名
    Dim lngHandle As Long '句柄
    Dim strWrite As String '要写入的文本内容
   
    strFileName = "c:/w.txt"
    lngHandle = FreeFile() '取得句柄
   
    '准备要写入的内容
    strWrite = "落日楼头,断鸿声里,江南游子。把吴钩看了,栏干拍遍,无人会、登临意。"
   
    Open strFileName For Output As lngHandle    '打开文件
    Print #lngHandle, strWrite    '写入文本
    Close lngHandle    '关闭文件
   
MsgBox "写入完成。", vbInformation
 
  • 二进制文件的操作
 
    所有文件的存储其实质都是二进制的,二进制文件往往由两部分组成,一部分是文件头另一部分存放了文件的内容。文件头通常存放与文件格式有关的信息,以BMP等图象文件为例,它们的文件头中存放了是何种图形格式、图象大小、调色板等信息,要显示图象时先读取文件头以获得文件的详细信息,然后再按其格式把图象内容显示出来。用二进制方式可以操作任何的文件,当然至关重要的一点是要清楚了解所操作文件的文件头结构。
   
    VB中二进制文件操作主要应用的方法和函数有:Open,Close,Get,Put等。
Open:在For后面的打开模式要用Binary。
Close:关闭文件。
Get:在指定位置取得文件的内容,如果省略位置则从当前位置读取。
Put:在指定位置写入文件,如果省略位置参数就从当前位置写。
 
    下面结合代码讲解二进制文件的操作。
下述程序完成了将两个文件结合成一个文件以及将这个结合后的文件再拆分成原来的两个文件。文件头的结构是自己定义的,非常简单,共8个字节(也就是两个长整型的长度),前4个字节存放第一个文件的长度,后4个字节存放第二个文件的长度。为了更直观地表达文件的结构,现假设有两个文件,第一个文件长度是100字节,第二个文件是200字节,那么合并后得到的文件应该是308字节。按顺序来看,文件的结构是:
4第一文件的长度
4第二文件的长度
100第一文件的二进制内容
200第二文件的二进制内容
除了文件头的8字节长度是固定的后面的长度都会因文件的不同而变化的。
 
‘实现文件的合并
Private Sub MergeFile()
    Dim strFileName1 As String '第一个文件
    Dim strFileName2 As String '第二个文件
    Dim strOutput As String '合并后的文件
    Dim aryContent() As Byte '用来读取文件的数组,每次读取前要重定义
   
    strFileName1 = "c:/a.bmp"
    strFileName2 = "c:/b.bmp"
    strOutput = "c:/out.bmp"
   
    '注意下面三个Open语句都是用Binary模式打开的
    Open strOutput For Binary As #100
   
    Open strFileName1 For Binary As #1
    Open strFileName2 For Binary As #2
   
    Put #100, , LOF(1) '取得第一文件的长度,并把它写入到合并文件的文件头中
    Put #100, , LOF(2) '取得第二文件的长度,并写入到合并文件的文件头中
   
    ReDim aryContent(LOF(1) - 1) '重定义数组,为读取文件做准备
    Get #1, , aryContent() '取得第一文件的内容到数组
   
    Put #100, , aryContent() '把第一文件的内容写到合并文件中
   
    ReDim aryContent(LOF(2) - 1)
    Get #2, , aryContent()
   
    Put #100, , aryContent()
   
    '关闭文件
    Close #1
    Close #2
    Close #100
End Sub
‘实现文件的拆分
Private Sub SplitFile()
    Dim strFileName1 As String
    Dim strFileName2 As String
    Dim strFileSplit As String
    Dim aryContent() As Byte
    Dim lngLOF(1) As Long '存放从文件头取得的两个文件的长度
   
    strFileName1 = "c:/a2.bmp"
    strFileName2 = "c:/b2.bmp"
    strFileSplit = "c:/out.bmp"
   
    Open strFileSplit For Binary As #100
   
    Get #100, , lngLOF(0) '取得第一文件的长度
    Get #100, , lngLOF(1) '第二文件的长度
   
    Open strFileName1 For Binary As #1
    Open strFileName2 For Binary As #2
   
    ReDim aryContent(lngLOF(0)-1) '用第一文件的长度重定义数组,为读取第一文件做准备
    Get #100, 9, aryContent() '从第9字节,即文件后面开始读取第一文件的内容
    Put #1, , aryContent() '把取得的内容写入到拆分文件中
   
    ReDim aryContent(lngLOF(1)-1)
    Get #100, 9 + lngLOF(0) + 1, aryContent() '从第9字节再加上第一文件的长度处开始读取第二文件的内容,这里可以清楚地看到文件头的作用了
    Put #2, , aryContent
   
    Close #1
    Close #2
    Close #100
   
    MsgBox "拆分完成。", vbInformation
 
文本文件由于没有格式所以它的读写都比较简单和直观,而用二进制操作文件时其实质就是对文件头的理解,如果不知道文件头的结构那就无法对文件进行处理了,知道了文件头所包含的信息后,对文件的操作其实就是按规则进行Get、Put罢了。

一时间脑抽,打了简单的比赛,用用java写点ACM程序,好用不好用就这样了

今天,看见学弟们兴致勃勃的打一个模拟赛,很有兴趣就来试一试了! 我的水平也就止于模拟题,模拟模拟就完了 Problem A: 两只老虎 Time Limit: 1 Sec  Memory...

每天写点程序,生活多美好--1

m汇编学习过程中用到的实例: mov ax, 5807h   mov cx,9   mov al, [0010h] 虽然默认是DS段,但是没加DS的时候还是...
  • jo_say
  • jo_say
  • 2011年08月26日 19:24
  • 602

TC2.0直接写点技术显示汉字

  • 2010年09月15日 09:37
  • 5KB
  • 下载

写点什么吧,作为机器学习分类的开篇……

本打算用一年的时间将压缩感器的基本算法学完,可自从今年五月份把OMP类的算法学完之后就开始各种忙碌,到了六月份,本来抽出些时间打算学习基追踪类算法,也找了最优化类的参考书,也花了些许时间去看单纯形算法...
  • jbb0523
  • jbb0523
  • 2015年10月05日 16:41
  • 2257

网络盲写点网络(2015某市海康技术支持笔试)

简述家庭路由器的功能? 家用路由器就是家用电脑上网用的一种分配器,如果几家的距离不是很远又都有电脑。就可以用一根电话线同时上网而不相互影响,有无线路由和有线路由区别。让家庭内多台电脑共享一个帐号上网...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不得不写点VB程序
举报原因:
原因补充:

(最多只允许输入30个字)