回 帖 发 新 帖 刷新版面

主题:FileSystemObject的问题

FSO有一个TextStream(下面简称ts)对象
ts有一个Read(n)方法用来读取n个字符,有一个Skip(n)用来跳过n个字符
我想把一个文本文件分割成若干部分,设置了两个ts:tsR和tsW
在写新文件之前,用file对象的size属性获得了原文件大小,并根据分割的标准计算得到了要分成多少个部分,然后for循环,每次tsR读取一定数目的字符交给tsW写入新建文件。
问题是,ts是不是有指针什么的记录上次读取到的位置,还是每次读取都必须要用skip跳过上次读过的字符数目?提前设定好了每次读取的字符数目,这个数目一般不能把文件大小整除,每次read(n)之前读取AtEndOfLine属性判断,能否避免出现“文件到末尾”的错误?

回复列表 (共8个回复)

沙发

1、ts是不是有指针什么的记录上次读取到的位置,还是每次读取都必须要用skip跳过上次读过的字符数目?
   你试一下就知道了。
2、能否避免出现“文件到末尾”的错误?
   使用错误收集语句处理,或者,循环变量的终值减1后,在循环外处理最后不足部分。

板凳

试了一下
我觉得用捕捉错误并不能完整的处理文本。就用终值减一的办法,但是还是出现错误

请问用fso的file对象读取的文件大小是字符数还是字节数?VB处理任何字符都是双字节,而在系统中有很大一部分字符是单字节的,这样,终值减一的办法也无法预测最后剩余多少字符。
如果文件大小是指字节数就只能回归老办法,readline了

3 楼

在运行中出错,debug了一下,得到数据
文件大小793535
被分成每个文件5000字符的话,将分成159个文件
但是才到第85个文件就超出文件结尾了,85约为159的一半
不应该啊,这个文本文件是一个小说,单字节字符很少(其中的标点符号也大多是全角),就算文件大小是字节数,也不应该到85就到结尾啊

4 楼

在读的时候设置缓冲区,一般设为2 的n次幂。用filelen获取文件大小,lof(filenum)获取文件实际长度。二进制分割。

5 楼

算了,用readall

6 楼

[quote]文件大小793535。将分成159个文件
但是才到第85个文件就超出文件结尾了,85约为159的一半[/quote]估计是中文和西文之间的关系出错了。
文件大小793535。单位应该是[size=3]字节[/size]。
被分成每个文件5000字符的话。单位是[size=3]汉字字符[/size],二个字节。

7 楼

用ReadAll解决了

8 楼

TextStream的Read方法读取的是字符数而非字节数,在NT/XP下(Unicode),就算是中英混合,也不用我们介入:

s = ts.Read(7)

s为:"FSO对象模型",如果算字节则应该是11。

没在Win9x下测试过,不知道SBCS系统下的情况。

我来回复

您尚未登录,请登录后再回复。点此登录或注册