早期的VB是采用单字节处理方式(通常也称为ANSI方式),也就说一个英文字母用一个字节表示,一个汉字算两个字节,当然这样就可能出现半个汉字的问题。从VB 4.0起,VB采用了一种新的处理方式,即内部采用Unicode方式,即不论英文字母还是汉字,一律用两个字节表示,但Unicode还不够普及,所以VB只是在其内部完全使用Unicode,而在外部仍转换为人们习惯的ANSI方式,但在字符串处理上与先前的版本有所不同。例如:Len("电子&电脑")=5(这里的&号为半角字符),而在以前的版本或纯英文Windows中Len("电子&电脑")=9。除了Len、Left、Right等字符串函数受此影响外,Input函数也受此影响。Input函数的第一个参数是要读入的字符数,它采用的是和Len一样的计数方式,即一个英文字母算一个字符,而一个汉字(两个字节)算一个字符。这看起来是个好主意,你不会读入半个汉字,但实际上糟透了,因为VB的LOF函数和FileLen函数都返回的是字节数,VB中没有一个能区分汉字和英文字母的LOF函数或FileLen函数!如果你的文件中有100个汉字,那么LOF函数和FileLen函数返回文件长度200个字符,执行Input(200, filenum1),VB读到第100个汉字时就把文件读完了,所以提示错误:"输出超出文件尾"。而二进制就不同了,在二进制中,以字节为单位,一个汉字占两个字节,所以不会出现错误
VB读写文件要用到以下语句:
1、Open语句打开文件。
2、AS INPUT,OUTPUT,APPEND(文本方式),binary,random(二进制方式)打开文件
3、读文件使用Line Input、Input #,(以上为文本方式)和Get(以上为二进制方式)。
4、写文件使用Print #、Write(以上为文本方式)和Put(以上为二进制方式)。
5、Close语句关闭文件
5、二进制方式下移动文件位置使用Seek语句。
其中,你说的顺序打开文件INPUT是指文本方式打开,打开ANSI编码的文件正常,我试过打开UNICODE编码文件,用INPUT #读出来以后是乱码,需要用STRCONV来转换成ANSI才能显示!上面说了,此时内部采用Unicode方式,Len("中中中中")=4,
BINARY和RANDOM这两种打开方式几乎相同,不一样的是BINARY是以一个字节为单位,而RANDOM是以指定的长度为单位.这两种方式都是以二进制方式打开文件的,我曾经试过,用这两种方式打开一个文本文件时,得到的是二进制数据,如果是用INPUT 或 LINE INPUT 读入的话,假设s读入了"中中中中",用LEN(s)=7 (其实按道理来说应该是8,实际上用GET读取的也是8,但这里却是7,我问了一个朋友,他说可能是因为UNICODE存放高低位顺序的原因).拿"中中中中"来说吧,不同读入方法得到的二进制结果如下:
ANSI格式,内容"中中中中",打开方式:INPUT, 读取方式,INPUT #,结果:D6 D0 D6 D0 D6 D0 D6 D0 0D 0A
ANSI格式,内容"中中中中",打开方式:BINARY,读取方式,INPUT#,结果:D0 D6 D0 D6 D0 D6 3F 0A
D0 D6位置改变,导致出现乱码
其实顺序打开文件、random 、binary 这3中打开文件方式准确的说应该是两种,文本和二进制,其实文本文件和二进制文件的区别是什么,我想每个学电脑的人大概都明白吧,文本文件也是二进制文件的一种,文本文件也可以用二进制方式打开,只不过需要经过复杂的转换才能变成我们看到的ANSI字符,这样的话,文本方式打开文件,直接读取就可以得到我们看得懂的文字,当然更方便,但有些时候,比如处理图像声音等文件时,我们需要的是另一种效果,那样的话,文本方式就不太合适了,因为文本方式只认识标准ANSI或Unicode,其它的可能会忽略或去掉,所以,这个时候就是二进制上场的时候了!
以上仅为个人理解,不足之处还请见谅
温馨提示:答案为网友推荐,仅供参考