结构的读写进文件的简便方法

vbfool 2008-10-10 03:11:48
我有一个结构
5个Integer,2个String。推荐一个好些的方法。BinaryReader和BinaryWriter感觉还是太繁琐。
...全文
159 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
eastkiki 2008-10-10
  • 打赏
  • 举报
回复
Buffer.BlockCopy(wrk, idx, swrk, 0, SizeOf(buff.NewDate))
buff.NewDate = swrk(0)
idx += SizeOf(buff.NewDate)

Buffer.BlockCopy(wrk, idx, swrk, 0, SizeOf(buff.OldDate))
buff.OldDate = swrk(0)
idx += SizeOf(buff.OldDate)
eastkiki 2008-10-10
  • 打赏
  • 举报
回复
<Serializable()> _
Structure FHeader
Public IntNew As Integer
Public IntOld As Integer
Public RecSav As Integer
Public RecLag As Integer
Public NewDate As String
Public OldDate As String
End Structure
...
Dim buff As FHeader
Public address As String = "..." '文件地址
Public FStream As FileStream
'read
FStream = New FileStream(add, FileMode.Open)
Dim wrk(SizeOf(buff) - 1) As Byte
Dim swrk(0) As Double
Dim iwrk(0) As Integer
Dim idx As Integer
FStream.Seek(0, SeekOrigin.Begin)
FStream.Read(wrk, 0, SizeOf(buff))
idx = 0
Buffer.BlockCopy(wrk, idx, iwrk, 0, SizeOf(buff.IntNew))
buff.IntNew = iwrk(0)
idx += SizeOf(buff.IntNew)

Buffer.BlockCopy(wrk, idx, iwrk, 0, SizeOf(buff.IntOld))
buff.IntOld = iwrk(0)
idx += SizeOf(buff.IntOld)

Buffer.BlockCopy(wrk, idx, iwrk, 0, SizeOf(buff.RecSav))
buff.RecSav = iwrk(0)
idx += SizeOf(buff.RecSav)

Buffer.BlockCopy(wrk, idx, iwrk, 0, SizeOf(buff.RecLag))
buff.RecLag = iwrk(0)
idx += SizeOf(buff.RecLag)

Buffer.BlockCopy(wrk, idx, swrk, 0, SizeOf(buff.NewDate))
buff.NewDate = dwrk(0)
idx += SizeOf(buff.NewDate)

Buffer.BlockCopy(wrk, idx, swrk, 0, SizeOf(buff.OldDate))
buff.OldDate = dwrk(0)
idx += SizeOf(buff.OldDate)


Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.OkOnly)
End Try
FStream.Close()
End Sub
vbfool 2008-10-10
  • 打赏
  • 举报
回复
继续详细化一些。
我定义的是一个类,包含上述的7个属性。用一个继承CollectionBase的强集合类来管理实例。
希望在强集合类里写一个将每条数据都保存的函数。还有一个读取数据的函数。
如何序列化呢?
xfyxq 2008-10-10
  • 打赏
  • 举报
回复
假定你有结构:


'注意:<Serializable()>用于指明本结构可被序列化
<Serializable()> _
Public Structure MyStru
dim string1 as string
dim string2 as string
dim i1 as integer
dim i2 as integer
dim i3 as integer
dim i4 as integer
dim i5 as integer
end Structure


你可以用以下函数进行处理:

'结构转换为字节
public function StruConvToArray(byval stru as MyStru) as byte()
Using U_Mo As New IO.MemoryStream '这里你也可以直接创建一个文件流,直接保存到文件中
Dim U_bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
U_bf.Serialize(U_Mo, stru)
Return U_Mo.ToArray()
End Using
end public

'字节转换为结构
public function ArrayConvToStru(byval Arr as byte()) as MyStru
Using U_Mo As New IO.MemoryStream(Arr)
Dim U_bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
return U_bf.Deserialize(U_Mo)
End Using
end public



vbfool 2008-10-10
  • 打赏
  • 举报
回复
序列化具体怎么做呢?我看了下MSDN,没太弄懂。
另外结构是存储在ArrayList中的。
eastkiki 2008-10-10
  • 打赏
  • 举报
回复
buff.blockcopy
eastkiki 2008-10-10
  • 打赏
  • 举报
回复
buff.blockcopy
xfyxq 2008-10-10
  • 打赏
  • 举报
回复
最简单的做法是对这个结构进行SOAP序列化保存,一劳永逸、随意扩展结构成员而不影响代码。
东方之珠 2008-10-10
  • 打赏
  • 举报
回复
在你的结构里面采用数组:

Option Explicit

Dim Arr(), Brr()

Private Type DefStructer
Arr(5) As Integer
Brr(2) As String
End Type
Private cStruct As DefStructer

Private Sub Command1_Click()
Dim i As Integer
For i = 0 To 5
cStruct.Arr(i) = i
Debug.Print cStruct.Arr(i)
Next

cStruct.Brr(0) = 0: cStruct.Brr(1) = 1: cStruct.Brr(2) = 2
Debug.Print cStruct.Brr(0), cStruct.Brr(1), cStruct.Brr(2)

End Sub

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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