读取二进制文件出错,各位兄台有没有遇到这种情况呀!

wwqna 2004-08-10 07:06:09
dim mem as string
open "c:\123.txt" for binary access read as #1
mem =space(1024)
get #1,,mem
这时你用loc(1)去看文件指针根本不在1024,绝对是超过1024,如果
mem=space(1),这样就不会有问题。
...全文
204 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
northwolves 2004-08-14
  • 打赏
  • 举报
回复
直接 Put #1, , String(1000, "*")可能按VARIANT 处理了

所以推荐显式的定义变量和赋值。
northwolves 2004-08-14
  • 打赏
  • 举报
回复
变量定义的问题。

MSDN:Variant 总保持 16 位,无论其中存储了什么数据。对象、字符串和数组,在物理上并非存于 Variant 之中;在这些情况下,用四个字节的 Variant 来保持对象引用、或者字符串或数组的指针。而真正的数据存在其它地方。

比较一下:
Private Sub Command1_Click()
Dim MEM As String
MEM = String(1000, "*")
Open "c:\1234.txt" For Binary As #1
Put #1, , MEM
MsgBox Loc(1) 'return 1000
Close 1
End Sub

Private Sub Command2_Click()
Open "c:\1234.txt" For Binary As #1
Put #1, , String(1000, "*")
MsgBox Loc(1)' return 1004
Close 1
End Sub

可见,有4 个字节用于指针的保存
wwqna 2004-08-14
  • 打赏
  • 举报
回复
northwolves(狼行天下) :
好像不是你说的那样子,因为你的理由解决不了:
Put #1,,string(1000,"*")再debug.pring loc(i)
因为这里面根本没有中文字符。
wwqna 2004-08-14
  • 打赏
  • 举报
回复
up
northwolves 2004-08-14
  • 打赏
  • 举报
回复
这样读比较好:

Private Sub Command1_Click()
Dim arrb() As Byte, mem As String
Open "c:\123.txt" For Binary As #1
ReDim arrb(1 To LOF(1))
Get #1, , arrb
Close 1
mem = StrConv(arrb, vbUnicode)
Erase arrb
End Sub
northwolves 2004-08-14
  • 打赏
  • 举报
回复
字节与字符的区别
你的"c:\123.txt"前1024个字符中含有中文字符loc(1)-len(mem) 个,若是纯英文字符文本文件就不会存在这个问题。
wwqna 2004-08-14
  • 打赏
  • 举报
回复
northwolves(狼行天下) ,谢谢你了!
wwqna 2004-08-14
  • 打赏
  • 举报
回复
我也是这样估计,很可能就是指针的地址,我现在把mem设为byte,就不会出现这种问题了,
wwqna 2004-08-12
  • 打赏
  • 举报
回复
那你们Put #1,,string(1000,"*")再debug.pring loc(i)试试,绝对不在1000
  • 打赏
  • 举报
回复
没有什么问题
落伍者 2004-08-10
  • 打赏
  • 举报
回复
我执行了,你的代码,指针是在1024

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧