VB 5提示错误:"输入超出文件尾"

前端之家收集整理的这篇文章主要介绍了VB 5提示错误:"输入超出文件尾"前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我在VB 5中使用Input(number,[#]filenumber)时,用LOF([#]filenumber)来表示文件长度;但执行中VB 5提示错误:"输出超出文件尾"。用FileLen(filepath)得出文件长度也一样。这是怎么回事?
Private Sub Command3_Click()
Dim TextLine As String
Dim filenum1 As Integer,filenum2 As Integer
Dim ds As Double
Dim de As Double

filenum1 = FreeFile()
Open "d:/test1.txt" For Input As filenum1 ' 打开文件

Dim l As Integer
l = FileLen("d:/test1.txt") ' 用FileLen查询文件长度

filenum2 = FreeFile() ' 取下一个空文件
Open "d:/output.txt" For Output As filenum2

ds = Timer
TextLine = Input(LOF(filenum1),filenum1) ' 出错
Write #filenum2,TextLine

'--------------------------以下代码可正常使用

Do While Not EOF(filenum1) ' 循环至文件尾。
Line Input #filenum1,TextLine ' 读入一行数据并将其赋予某变量。
'Debug.Print TextLine ' 在调试窗口中显示数据。
Print #filenum2,TextLine ' 写入新建的文件
Loop
'----------------------------------
de = Timer
Debug.Print de - ds

Close filenum1
Close filenum2 ' 关闭文件
End Sub

回答:

首先感谢你寄来了相关的程序片断。我经常收到一些关于程序设计的问题,可连一行代码都没提供,只有出错信息,真不知如何下手。正是借助你的程序,我一下子就看出了问题,否则我的解答可能是一堆废话了。很明显问题出在Input语句,但我们得从VB处理字符串的方式讲起。早期的VB是采用单字节处理方式(通常也称为ANSI方式),也就说一个英文字母用一个字节表示,一个汉字算两个字节,当然这样就可能出现半个汉字的问题。从VB 4.0起,VB采用了一种新的处理方式,即内部采用Unicode方式,即不论英文字母还是汉字,一律用两个字节表示,但Unicode还不够普及,所以VB只是在其内部完全使用Unicode,而在外部仍转换为人们习惯的ANSI方式,但在字符串处理上与先前的版本有所不同。例如:在中文Windows或英文Windows外挂RichWin 97中,Len("电子&电脑")=5(这里的&号为半角字符),而在以前的版本或纯英文Windows中Len("电子&电脑")=9。除了Len、Left、Right等字符串函数受此影响外,Input函数也受此影响。Input函数的第一个参数是要读入的字符数,它采用的是和Len一样的计数方式,即一个英文字母算一个字符,而一个汉字(两个字节)算一个字符。这看起来是个好主意,你不会读入半个汉字,但实际上糟透了,因为VB的LOF函数和FileLen函数都返回的是字节数,VB中没有一个能区分汉字和英文字母的LOF函数或FileLen函数!如果你测试文件d:/test1.txt全部是英文,那么你的这段程序可以正确运行,尽管你没有寄来测试文件,但我可以和你打赌,这个文件中有中文。如果你的文件中有100个汉字,那么LOF函数和FileLen函数返回文件长度200个字符,执行Input(200,filenum1),VB读到第100个汉字时就把文件读完了,所以提示错误:"输出超出文件尾"。可能会有人想,把LOF函数和FileLen函数返回文件长度除以2不就行了。是的,如果你的文件中只包括全角字符,那么这么改就对了,但我们平时接触的很多文件都是全角半角混杂的。VB提供了InputB函数,它可以按字节数读入文件,但实际上这个函数错误,如果你用它读入的文件,那么你得到的可能是象"??????"这样的字符串。我想很多用户都见过这种奇怪的情况。Line Input语句就没有这个问题,因为它不计数,只看文件中是否有回车和换行,但Line Input语句比Input语句慢得多。怎么解决这个问题呢,我有一个办法不见得好,但可以应急。把Open打开文件的方式由Input改为Binary方式,即
Open "d:/test1.txt" For Binary As filenum1
然后,使用Get语句代替Input语句:
TextLine = Space(LOF(filenum1))
Get filenum1,TextLine
这个语句速度同Input函数相当,而没有前述的问题。

王楠的意见: 在vb6中可以用strconv(input(filename),vbUnicode),这可能更好!

猜你在找的VB相关文章