?? vb5提示錯(cuò)誤輸入超出文件尾.txt
字號:
首先感謝你寄來了相關(guān)的程序片斷。我經(jīng)常收到一些關(guān)于程序設(shè)計(jì)的問題,可連一行代碼都沒提供,只有出錯(cuò)信息,真不知如何下手。正是借助你的程序,我一下子就看出了問題,否則我的解答可能是一堆廢話了。很明顯問題出在Input語句,但我們得從VB處理字符串的方式講起。早期的VB是采用單字節(jié)處理方式(通常也稱為ANSI方式),也就說一個(gè)英文字母用一個(gè)字節(jié)表示,一個(gè)漢字算兩個(gè)字節(jié),當(dāng)然這樣就可能出現(xiàn)半個(gè)漢字的問題。從VB 4.0起,VB采用了一種新的處理方式,即內(nèi)部采用Unicode方式,即不論英文字母還是漢字,一律用兩個(gè)字節(jié)表示,但Unicode還不夠普及,所以VB只是在其內(nèi)部完全使用Unicode,而在外部仍轉(zhuǎn)換為人們習(xí)慣的ANSI方式,但在字符串處理上與先前的版本有所不同。例如:在中文Windows或英文Windows外掛RichWin 97中,Len("電子&電腦")=5(這里的&號為半角字符),而在以前的版本或純英文Windows中Len("電子&電腦")=9。除了Len、Left、Right等字符串函數(shù)受此影響外,Input函數(shù)也受此影響。Input函數(shù)的第一個(gè)參數(shù)是要讀入的字符數(shù),它采用的是和Len一樣的計(jì)數(shù)方式,即一個(gè)英文字母算一個(gè)字符,而一個(gè)漢字(兩個(gè)字節(jié))算一個(gè)字符。這看起來是個(gè)好主意,你不會讀入半個(gè)漢字,但實(shí)際上糟透了,因?yàn)閂B的LOF函數(shù)和FileLen函數(shù)都返回的是字節(jié)數(shù),VB中沒有一個(gè)能區(qū)分漢字和英文字母的LOF函數(shù)或FileLen函數(shù)!如果你測試文件d:\test1.txt全部是英文,那么你的這段程序可以正確運(yùn)行,盡管你沒有寄來測試文件,但我可以和你打賭,這個(gè)文件中有中文。如果你的文件中有100個(gè)漢字,那么LOF函數(shù)和FileLen函數(shù)返回文件長度200個(gè)字符,執(zhí)行Input(200, filenum1),VB讀到第100個(gè)漢字時(shí)就把文件讀完了,所以提示錯(cuò)誤:"輸出超出文件尾"。可能會有人想,把LOF函數(shù)和FileLen函數(shù)返回文件長度除以2不就行了。是的,如果你的文件中只包括全角字符,那么這么改就對了,但我們平時(shí)接觸的很多文件都是全角半角混雜的。VB提供了InputB函數(shù),它可以按字節(jié)數(shù)讀入文件,但實(shí)際上這個(gè)函數(shù)有錯(cuò)誤,如果你用它讀入的文件,那么你得到的可能是象"??????"這樣的字符串。我想很多用戶都見過這種奇怪的情況。Line Input語句就沒有這個(gè)問題,因?yàn)樗挥?jì)數(shù),只看文件中是否有回車和換行,但Line Input語句比Input語句慢得多。怎么解決這個(gè)問題呢,我有一個(gè)辦法不見得好,但可以應(yīng)急。把Open打開文件的方式由Input改為Binary方式,即
Open "d:\test1.txt" For Binary As filenum1
然后,使用Get語句代替Input語句:
TextLine = Space(LOF(filenum1))
Get filenum1, , TextLine
這個(gè)語句速度同Input函數(shù)相當(dāng),而沒有前述的問題。
<END>
在vb6中可以用strconv(input(filename),vbUnicode),這可能更好!
<END>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -