| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 431 人关注过本帖
标题:读取TXT文件中的内容以字节方式写入文件出错,望能帮忙解决。
只看楼主 加入收藏
ictest
Rank: 2
等 级:论坛游民
帖 子:223
专家分:77
注 册:2010-2-17
结帖率:74.63%
  已结贴   问题点数:10  回复次数:7   
读取TXT文件中的内容以字节方式写入文件出错,望能帮忙解决。
一个TXT文件,内容类似下方所示:
00
00
02
00
05
00
0E

我现在按行读取TXT文件内容,然后想以字节方式写入一个文件的指定位置,如读取了“00”,那么就在文件指定位置写入“00”;如读取了“05”,那么就在文件指定位置写入“05”;如读取了“0E”,那么就在文件指定位置写入“0E”.......但我的程序读前面的纯数字(00、02、05等)没报错,当读到“0E”就报错“实时错误13,类型不匹配”,请问怎么处理?

我的程序如下:
程序代码:
Private Sub Command1_Click()
i = 0
Dim A1 As Byte
Open Dir2.Path & "\" & File1.FileName  For Input As #1
Open Dir1.Path & "\" & File2.FileName For Binary As #2
        Do While Not EOF(1)
        Line Input #1, temp
        A1 = Hex("&H" + temp)

Put #2, (((i * 6) + 5) + 236), A1   写入变量A1的数据
i = i + 1
        If i = (196 * 225) - 1 Then
        Exit Do
        End If
Loop
Close #1
Close #2
MsgBox "ok"
End Sub


文本文件和欲写入的文件在下方:


另外,想请帮忙检查一下我这段程序是否会把TXT文件里的内容写入指定位置,因为欲写入的文件非常注重数据位置,这个文件是这样的:前235个字节写的是各种基本资料,从第236字节开始,每6个字节写得是一个零件的状态,其中最后的一个字节就是需要读TXT文件改写的,我这个(((i * 6) + 5) + 236)自己算算好像是对的,请大神再帮我把把关。
附件: 您没有浏览附件的权限,请 登录注册
2018-06-02 17:10
wds1
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:22
帖 子:240
专家分:1312
注 册:2016-3-10
  得分:2 
A1定义为如下可以解决0e问题,但是你的数据有0h识别不了的。

Dim A1 As Variant
2018-06-02 18:02
Artless
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:98
帖 子:4195
专家分:28787
注 册:2009-4-8
  得分:2 
没报错结果是什么

无知
2018-06-04 03:22
ZHRXJR
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:65
帖 子:694
专家分:3731
注 册:2016-5-10
  得分:2 
回复 楼主 ictest
Hex函数是返回一个数值的十六进制的字符串,格式:A = Hex(400) 返回值是字符串: 190,基本格式 A = Hex(B),B必须是一个有效的十进制整数。
你的 A1 = Hex("&H" + temp) 语句中,如果temp是十进制整数,这个语句可以执行,如果temp不是十进制整数,而是一个字符串,就会发生错误
其实如果temp是十进制整数, A1 = Hex("&H" + temp) 与  A1 = Hex(temp)是一样的,因为函数会忽略字符串"&H"。
你的文本文件中的好多不是十进制整数,例如0H、0G、0E等等,因此函数无法就字符串转换为十六进制数的字符串而产生错误。

QQ    2653043392
2018-06-04 09:06
ictest
Rank: 2
等 级:论坛游民
帖 子:223
专家分:77
注 册:2010-2-17
  得分:0 
多谢各位版主的教导和帮助,我在这里解释一下,欲写入的文件比较特殊,它的数据方式似乎有他自己的排列和计算方式,所以需要写入的值有些奇怪,例如,1~9他要求写入的值是01~09;
A~F他要求写入的值是0A~0F;G~Z他要求写入的是10~29。我原来没有发现这个问题,只是直接读取,所以出现0H、0G等等,这是我的不对,给各位带来麻烦,真是不好意思。

目前我已经TXT文件内容按照他要求的值正常生成了,里面包含有00~09、0A~0F、10~29等大部分的值,也能正确读取和写入文件(我用的是笨方法),但是新的问题出现了,本来我只想改写文件的从237字节开始每第六个字节值,但是改写完后发现,不但从237字节开始每第六个字节值被改变了(这是正确的),六个字节中第一个字节也发生了改变,全变成“00”了,
例如:原6个字节是412D41510001,我要改变成412D41510003,但经过我的程序改写后,却变成002D41510003。
百思不得其解,不知道哪里错了,还请各位版主多多帮助。
我的写入程序如下:

程序代码:

i = 0
'Dim A1 As Variant
Open Dir2.Path & "\" & File2.FileName & "-temp2.txt" For Input As #5
Open Dir1.Path & "\" & File1.FileName For Binary As #6
        Do While Not EOF(5)
        Line Input #5, temp2
'        A1 = Hex("&H" + temp2)
If temp2 = "00" Then
Put #6, (((i * 6) + 5) + 237), &H0
End If
If temp2 = "01" Then
Put #6, (((i * 6) + 5) + 237), &H1
End If
If temp2 = "02" Then
Put #6, (((i * 6) + 5) + 237), &H2
End If
If temp2 = "03" Then
Put #6, (((i * 6) + 5) + 237), &H3
End If
If temp2 = "04" Then
Put #6, (((i * 6) + 5) + 237), &H4
End If
If temp2 = "05" Then
Put #6, (((i * 6) + 5) + 237), &H5
End If
If temp2 = "06" Then
Put #6, (((i * 6) + 5) + 237), &H6
End If
If temp2 = "07" Then
Put #6, (((i * 6) + 5) + 237), &H7
End If
If temp2 = "08" Then
Put #6, (((i * 6) + 5) + 237), &H8
End If
If temp2 = "09" Then
Put #6, (((i * 6) + 5) + 237), &H9
End If
If temp2 = "0A" Then
Put #6, (((i * 6) + 5) + 237), &HA
End If
If temp2 = "0B" Then
Put #6, (((i * 6) + 5) + 237), &HB
End If
If temp2 = "0C" Then
Put #6, (((i * 6) + 5) + 237), &HC
End If
If temp2 = "0D" Then
Put #6, (((i * 6) + 5) + 237), &HD
End If
If temp2 = "0E" Then
Put #6, (((i * 6) + 5) + 237), &HE
End If
If temp2 = "0F" Then
Put #6, (((i * 6) + 5) + 237), &HF
End If
If temp2 = "10" Then
Put #6, (((i * 6) + 5) + 237), &H10
End If
If temp2 = "11" Then
Put #6, (((i * 6) + 5) + 237), &H11
End If
If temp2 = "12" Then
Put #6, (((i * 6) + 5) + 237), &H12
End If
If temp2 = "13" Then
Put #6, (((i * 6) + 5) + 237), &H13
End If
If temp2 = "14" Then
Put #6, (((i * 6) + 5) + 237), &H14
End If
If temp2 = "15" Then
Put #6, (((i * 6) + 5) + 237), &H15
End If
If temp2 = "16" Then
Put #6, (((i * 6) + 5) + 237), &H16
End If
If temp2 = "17" Then
Put #6, (((i * 6) + 5) + 237), &H17
End If
If temp2 = "18" Then
Put #6, (((i * 6) + 5) + 237), &H18
End If
If temp2 = "19" Then
Put #6, (((i * 6) + 5) + 237), &H19
End If
If temp2 = "20" Then
Put #6, (((i * 6) + 5) + 237), &H20
End If
If temp2 = "21" Then
Put #6, (((i * 6) + 5) + 237), &H21
End If
If temp2 = "22" Then
Put #6, (((i * 6) + 5) + 237), &H22
End If
If temp2 = "23" Then
Put #6, (((i * 6) + 5) + 237), &H23
End If
If temp2 = "24" Then
Put #6, (((i * 6) + 5) + 237), &H24
End If
If temp2 = "25" Then
Put #6, (((i * 6) + 5) + 237), &H25
End If
If temp2 = "26" Then
Put #6, (((i * 6) + 5) + 237), &H26
End If
If temp2 = "27" Then
Put #6, (((i * 6) + 5) + 237), &H27
End If
If temp2 = "28" Then
Put #6, (((i * 6) + 5) + 237), &H28
End If
If temp2 = "29" Then
Put #6, (((i * 6) + 5) + 237), &H29
End If


i = i + 1
        If i = (114 * 118) - 1 Then
        Exit Do
        End If
Loop

Close #5
Close #6

MsgBox "ok"


附件清单如下:欲改写的文件、需要写入的第六位字节(TXT文件)、写入第六位字节前读出的6位字节、写入第六位字节后读出的6位字节,共四个文件。



附件: 您没有浏览附件的权限,请 登录注册
2018-06-04 11:06
wmf2014
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:141
帖 子:1680
专家分:9394
注 册:2014-12-6
  得分:2 
If temp2 = "00" Then
Put #6, (((i * 6) + 5) + 237), &H0
End If
If temp2 = "01" Then
Put #6, (((i * 6) + 5) + 237), &H1
End If
If temp2 = "02" Then
Put #6, (((i * 6) + 5) + 237), &H2
End If
If temp2 = "03" Then
Put #6, (((i * 6) + 5) + 237), &H3
End If
.
.
.

这样写代码一定是体育老师教的,这老师不是坑人么!

能编个毛线衣吗?
2018-06-04 11:10
ictest
Rank: 2
等 级:论坛游民
帖 子:223
专家分:77
注 册:2010-2-17
  得分:0 

让您见笑了,总想批量用"&H"但老是出错,就用了这个笨死了的办法,看到这样的写法,我自己也总有想去撞墙的冲动,但总归不报错,暂时用用吧。

但我的问题
目前我已经TXT文件内容按照他要求的值正常生成了,里面包含有00~09、0A~0F、10~29等大部分的值,也能正确读取和写入文件(我用的是笨方法),但是新的问题出现了,本来我只想改写文件的从237字节开始每第六个字节值,但是改写完后发现,不但从237字节开始每第六个字节值被改变了(这是正确的),六个字节中第一个字节也发生了改变,全变成“00”了,
例如:原6个字节是412D41510001,我要改变成412D41510003,但经过我的程序改写后,却变成002D41510003。
百思不得其解,不知道哪里错了,还请各位版主多多帮助。

不知是不是这种写法造成的,实在想不通,还请各位版主多多帮助。
2018-06-04 11:26
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:215
帖 子:4233
专家分:25903
注 册:2008-10-15
  得分:2 
我的 十六进制编辑器坏了,所以结果没法去看。
就拿你1楼的代码改了下。

程序代码:
Dim temp  As String            '变量定义是很重要的
Dim i As Long
Dim a1 As Byte                '这个变量你倒定义了
i = 0

'Open Dir2.Path & "\" & File1.FileName For Input As #1
'
Open Dir1.Path & "\" & File2.FileName For Binary As #2
        
Open App.Path & "\" & "temp2.txt" For Input As #1
Open App.Path & "\" & "001.BD7265-01" For Binary As #2
        
        
        Do While Not EOF(1)
        Line Input #1, temp
        a1 = CByte("&H" + temp)            '强制把字符串转为字节数据,超范围会导致溢出错误。 你原来使用 HEX 函数是错误的,实际上也就是错在这里。

Put #2, (((i * 6) + 5) + 236), a1
i = i + 1
        If i = (196& * 225) - 1 Then
        Exit Do
        End If
Loop
Close #1
Close #2

MsgBox "ok"


错误原因也就是在 4楼
HEX 返回为字符串结果,
"&H0E" ,返回的结果为 "OE",然后给 BYTE时,不符合10进制规则,报错。
使用 CBYTE时,
传入 "&H0E" ,检测到 &H前缀,会被解释为一个十六进制数据,OE 符合16进制规则,按16进制数据转换为 数值,然后返回。
当然,你也可以使用 val 函数。在明确知道数据类型时,不推荐这种方法。

10进制,16进制,是显示给人看的,计算机内部使用 二进制,外部接受任意进制,但除下10进制外,其他进制需要前缀。VB6还支持 8进制,16进制。


[此贴子已经被作者于2018-6-4 11:50编辑过]


授人于鱼,不如授人于渔
早已停用QQ了
2018-06-04 11:47







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038465 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved