怎样消除VB对文本文件查找替换后在文件尾多出的空行?

ssq119 2008-01-19 10:33:19
下面是对一文本文件进行查找替换的模块:

Private Sub Tihuan(TfilePath As String, Oldstr As String, Newstr As String)
Dim k() As Byte
Open TfilePath For Binary As #1
ReDim k(FileLen(TfilePath) - 1) As Byte
Get #1, , k
k = Replace(StrConv(k, vbUnicode), Oldstr, Newstr) '无条件全部替换
Close #1

Open TfilePath For Output As #2
Print #2, k
Close #2
End Sub

'调用方法

Private Sub Command2_Click()

Command2.Enabled = False

Call Tihuan("c:\1.txt", "旧字符", "新字符") ‘ c:\1.txt 可以超过 5 mb以上

Command2.Enabled = True

但在使用中发现,每调用一次,就在文本文件的最后多一个空行 , 执行1000次就多1000个空行。怎样消除这些空行?

...全文
269 点赞 收藏 23
写回复
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssq119 2008-01-25
感谢各位!除帮我解决了问题外,还使我学到不少。
回复
vbman2003 2008-01-24
嗯,你说的对。可以再完善一下:



Private Sub Tihuan(TfilePath As String, Oldstr As String, Newstr As String)

Dim s As String
Dim h As Long

h = FreeFile
Open TfilePath For Binary As h
s = Space(LOF(h) - 2)
Get h, , s
Close

s = Replace(s, Oldstr, Newstr) '无条件全部替换

h = FreeFile
Open TfilePath For Output As h
Print #h, s
Close

End Sub


如果问题已经解决,请及时结帖。不要凉了上面那么多热心人的心......
回复
zdingyun 2008-01-24
使用21楼代码,文件长度发生改变,每次较原来多出72字节。8楼代码和我在5楼贴出代码执行字节不增加。
但同意21楼意见;请及时结帖。不要凉了上面那么多热心人的心......
回复
ssq119 2008-01-22
但17楼的这句:
s=space(lof(#1))
应该为下面一句吧?
s = Space(LOF(1))
回复
ssq119 2008-01-22
楼上(17楼)的分析应该是对的,我试了下能行。
回复
ssq119 2008-01-22
楼上(17楼)的分析应该是对的,我试了下能行。
回复
chenhui530 2008-01-21
print的改成二进制打开使用put
回复
zdingyun 2008-01-21
9楼,Print改为write,会在整个文件前后加上一对"" 。
回复
cike_1111 2008-01-21
Print 改为 write 试下!

好象print写入 的 后面自动加上点什么.. 而用另一个就不会有这样的情况 好象是 write吧 好象又是 put.. 不太记得了!
回复
zzyong00 2008-01-21
如都用文本方式读写,连替换都不能进行。
------------------
什么意思?为什么不能替换?
Private Sub Tihuan(TfilePath As String, Oldstr As String, Newstr As String)
Dim k As String, s As String
Open TfilePath For Input As #1
Do While Not EOF(1) ' 循环至文件尾。
s = Input(1, #1) ' 读入一个字符。
k = k + s
Loop
k = Replace(k, Oldstr, Newstr) '无条件全部替换
Close #1

Open TfilePath For Output As #2
Print #2, k;
Close #2
End Sub
回复
vbman2003 2008-01-21
你这个情况估计文本本身尾部有个回车符,所以替换文件后会不断增加,如下试试:



Private Sub Tihuan(TfilePath As String,Oldstr As String, Newstr As String)
Dim k() As Byte
Open TfilePath For Binary As #1
ReDim k(FileLen(TfilePath)-1)
Get #1, , k
Close #1

k=Replace( mid(StrConv(k,vbUnicode),1,len(StrConv(k,vbUnicode))-1) _
,Oldstr,Newstr) '无条件全部替换
Open TfilePath For Output As #2
Print #2, k
Close #2
End Sub


'看你的代码完全是字符处理,所以可以这样:
Private Sub Tihuan(TfilePath As String,Oldstr As String, Newstr As String)
Dim s As string
Open TfilePath For Binary As #1
s=space(lof(#1))
Get #1, , s
Close #1

s=Replace(mid(s,1,len(s)-1),Oldstr,Newstr) '无条件全部替换

   Open TfilePath For Output As #2
Print #2, s
Close #2
End Sub


回复
zdingyun 2008-01-21
我试了下8楼代码可用。
回复
。。。。。。。。。。。。
回复
cike_1111 2008-01-21
那么说应该是 put 了!!

我只记得以前看过的一篇文章 说解决这个问题的 不能用 print ..要哪个记不太清楚..
回复
of123 2008-01-21
更正:
Open TfilePath For Output As #2
Put #2, 0, k
Close #2
回复
of123 2008-01-21
试试:

Open TfilePath For Output As #2
Put #2, k
Close #2



Open TfilePath For Output As #2
Print #2, k;
Close #2
回复
ssq119 2008-01-19
谢谢!
用此法:
k = Replace(StrConv(k, vbUnicode), Oldstr, left(Newstr,len(Newstr)-2)) '无条件全部替换
试过,无效。

我原来的代码运行后在所查找替换的文本文件的最后部分多了些空行,并不是在查找替换处多了空行。
回复
zzyong00 2008-01-19
你的读写文件的方法很怪,既然只是要进行文本替换,为什么要用二进制读的方式,却又用文本写的方式,
建议你都用文本方式读写,应该可以消除你说的问题,至于为什么,你自己想想吧
回复
caofusheng 2008-01-19
Newstr中最后有回车换行,去掉后再替换。
这样试试。
k = Replace(StrConv(k, vbUnicode), Oldstr, left(Newstr,len(Newstr)-2)) '无条件全部替换
回复
zdingyun 2008-01-19
LZ,你的代码写文件后,就多出Chr(10)及Chr(13)
属于文件的换行符
回复
发动态
发帖子
VB基础类
创建于2007-09-28

7453

社区成员

VB 基础类
申请成为版主
社区公告
暂无公告