如何将格式化数据写入文件然后读取? VB.NET(2012年版)

时间:2014-01-12 13:53:16

标签: vb.net read-write

我正在练习VB.NET,而且我在阅读和写入.dat文件时遇到了问题。我已经建立了一个临时存储数据的结构(下图)。

Structure CustomerType
    Dim AccountNum As String
    Dim Surname As String
    Dim Forename As String
    Dim Balance As Decimal
End Structure

然后我把所有东西都变暗了。

Dim Customers(9) As CustomerType
Dim Filename As String = "Accounts.dat"
Dim NumberOfRecords As Short = 0
Dim myFormat As String = "{0,-15}|{1,-15}|{2,-10}|{3,-10}"

我有一个创建新帐户的按钮,这就是我遇到问题的地方。

    FileOpen(1, Filename, OpenMode.Random, , , )
    For i = 1 To Customers.Length() - 1
        With Customers(i)
            .Forename = InputBox("First name", "Forename")
            Do Until .Forename <> "" And TypeOf .Forename Is String
                .Forename = InputBox("First name", "Forename")
            Loop
            .Surname = InputBox("Surname", "Surname")
            Do Until .Surname <> "" And TypeOf .Surname Is String
                .Surname = InputBox("Surname", "Surname")
            Loop
            .AccountNum = InputBox("Account Number of " & Customers(i).Forename & " " & Customers(i).Surname & ".", "Account Number")
            Do Until .AccountNum.Length = 8 And TypeOf .AccountNum Is String
                .AccountNum = InputBox("Account Number of " & Customers(i).Forename & " " & Customers(i).Surname & ".", "Account Number")
            Loop
            .Balance = InputBox("Balance of " & Customers(i).Forename & " " & Customers(i).Surname & ".", "Balance")
            Do Until .Balance > -1
                .Balance = InputBox("Balance of " & Customers(i).Forename & " " & Customers(i).Surname & ".", "Balance")
            Loop
            FilePut(1, Customers, NumberOfRecords + 1)
            NumberOfRecords += 1
            lblNumberOfRecords.Text = NumberOfRecords
        End With
    Next
    FileClose(1)

我有另一个按钮,用于在列表框中显示数据。在得到错误的长度错误之前,我只能显示一个项目。

    Dim Index As Integer
    ListBox1.Items.Clear()
    ListBox1.Items.Add(String.Format(myFormat, "Forename", "Surname", "Acc. Num.", "Balance"))
    ListBox1.Items.Add("_____________________________________________________")
    FileOpen(1, Filename, OpenMode.Random, , , )
    For Index = 1 To NumberOfRecords
        FileGet(1, Customers)
        ListBox1.Items.Add(String.Format(myFormat, Customers(Index).Forename, Customers(Index).Surname, Customers(Index).AccountNum, Format(Customers(Index).Balance, "currency")))
    Next Index
    FileClose(1)

我遇到的主要问题是我做错了什么,我该如何解决?

非常感谢, 约旦

1 个答案:

答案 0 :(得分:3)

首先,您需要导入这些名称空间:

Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO

<强>模型

将您的自定义类型模型更改为:

<Serializable()> _
Public Class CustomerType
    Implements ISerializable

    Public Sub New()
    End Sub

    Protected Sub New(info As SerializationInfo, context As StreamingContext)
        Me.AccountNum = info.GetString("AccountNum")
        Me.Surname = info.GetString("Surname")
        Me.Forename = info.GetString("Forename")
        Me.Balance = info.GetDecimal("Balance")
    End Sub

    Public AccountNum As String
    Public Surname As String
    Public Forename As String
    Public Balance As Decimal

    Public Sub GetObjectData(info As System.Runtime.Serialization.SerializationInfo, context As System.Runtime.Serialization.StreamingContext) Implements System.Runtime.Serialization.ISerializable.GetObjectData
        info.AddValue("AccountNum", Me.AccountNum)
        info.AddValue("Surname", Me.Surname)
        info.AddValue("Forename", Me.Forename)
        info.AddValue("Balance", Me.Balance)
    End Sub

End Class

您的模型现在支持序列化。下一步是创建函数以向/从文件读取/写入模型集合。

<强>写

Friend Shared Sub Write(filePathAndName As String, list As List(Of CustomerType))
    Dim formatter As IFormatter = New BinaryFormatter()
    Using stream As New FileStream(filePathAndName, FileMode.Create, FileAccess.Write, FileShare.None)
        formatter.Serialize(stream, list)
    End Using
End Sub

<强>读取

Friend Shared Function Read(filePathAndName As String) As List(Of CustomerType)
    Dim formatter As IFormatter = New BinaryFormatter()
    Dim list As List(Of CustomerType) = Nothing
    Using stream As New FileStream(filePathAndName, FileMode.Open, FileAccess.Read, FileShare.None)
        list = DirectCast(formatter.Deserialize(stream), List(Of CustomerType))
    End Using
    Return list
End Function

<强>用法

将名为Button1的按钮拖放到名为Form1的表单上并添加以下代码:

Public Class Form1

    Public Sub New()
        Me.InitializeComponent()
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim path As String = "C:\test.dat" '<- Change to desired path
        Dim list As New List(Of CustomerType)

        'Create test item1 and add to list.
        Dim item1 As New CustomerType()
        With item1
            .AccountNum = "1"
            .Balance = 1000D
            .Forename = "Forename 1"
            .Surname = "Surname 1"
        End With
        list.Add(item1)

        'Create test item2 and add to list.
        Dim item2 As New CustomerType()
        With item2
            .AccountNum = "2"
            .Balance = 2000D
            .Forename = "Forename 2"
            .Surname = "Surname 2"
        End With
        list.Add(item2)

        'Write to file:
        Write(path, list)

        'Read from file into new list:
        Dim list2 As List(Of CustomerType) = Read(path)

        MsgBox(String.Format("Count={0}", list2.Count))

    End Sub

    Friend Shared Sub Write(filePathAndName As String, list As List(Of CustomerType))
        Dim formatter As IFormatter = New BinaryFormatter()
        Using stream As New FileStream(filePathAndName, FileMode.Create, FileAccess.Write, FileShare.None)
            formatter.Serialize(stream, list)
        End Using
    End Sub

    Friend Shared Function Read(filePathAndName As String) As List(Of CustomerType)
        Dim formatter As IFormatter = New BinaryFormatter()
        Dim list As List(Of CustomerType) = Nothing
        Using stream As New FileStream(filePathAndName, FileMode.Open, FileAccess.Read, FileShare.None)
            list = DirectCast(formatter.Deserialize(stream), List(Of CustomerType))
        End Using
        Return list
    End Function

End Class