从文本文件中读取,每6个元素将数据存储到相应的结构中,然后形成一个数组

时间:2017-05-29 09:59:10

标签: vb.net

文本文件包含以下内容:在[]内部,()内的任何内容都不在文本文件中,只是为了澄清

[1(ID)

吉米(名字)

保罗(姓氏)

78(marks1)

80(marks2)

92(marks3)

2

詹姆斯

67

82

73 ]

我创建了一个结构,用于保存学生的详细信息,包括每个科目中的姓名,ID,标记。

Private Structure StudInfo
    Public FName As String
    Public LName As String
    Public StudentId As Integer
    Public ScMark As Integer
    Public EnMark As Integer
    Public MaMark As Integer

程序需要连续读取前六个元素,将每个元素存储到相应的结构类型中,然后让它成为数组“students()”的第一个元素,然后接下来的六个元素,让它成为该数组的第二个元素。我不知道如何使用循环来做到这一点。

Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    'create an array that hold student details
    Dim Students() As StudInfo

    ' read from text file 
    Dim FileNum As Integer = FreeFile()
    Dim TempS As String = ""
    Dim TempL As String
    FileOpen(FileNum, "some.text", OpenMode.Input)
    Do Until EOF(FileNum)
        TempL = LineInput(FileNum)
        TempS = TempL + vbCrLf
    Loop
End Sub

谢谢。

3 个答案:

答案 0 :(得分:0)

你必须使用BinaryReader(它将IO.Stream作为它的构造函数),然后你可以将你想要的数据类型读入你想要的变量。

您将遇到的问题是数据无法搜索(即您无法读取第30条记录,除非您实际读取前29条记录,因为字符串长度可变,因此记录的长度可变),这也适用于修改记录(你不能让它变大,因为它会覆盖下一条记录)。

答案是使用固定长度记录,或字段偏移或固定长度字符串。然后,您将拥有可预测大小的记录,您可以通过将文件长度除以记录大小来确定记录数量。

希望这有帮助。

答案 1 :(得分:0)

您可以尝试这样的事情:

Public Class Form1

    Private Students As New List(Of StudInfo)

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Students.Clear()
        Dim fileName = "c:\some folder\directory\someFile.txt"
        Using sr As New System.IO.StreamReader(fileName)
            Dim value As Integer
            Dim strValue As String

            While Not sr.EndOfStream
                Try
                    Dim student As New StudInfo
                    strValue = sr.ReadLine().Trim("[]")
                    If Integer.TryParse(strValue, value) Then
                        student.StudentId = value
                    Else
                        MessageBox.Show("Error Converting StudentID to Integer")
                        Exit Sub
                    End If

                    student.FName = sr.ReadLine().Trim("[]")
                    student.LName = sr.ReadLine().Trim("[]")

                    strValue = sr.ReadLine().Trim("[]")
                    If Integer.TryParse(strValue, value) Then
                        student.ScMark = value
                    Else
                        MessageBox.Show("Error Converting ScMark to Integer")
                        Exit Sub
                    End If

                    strValue = sr.ReadLine().Trim("[]")
                    If Integer.TryParse(strValue, value) Then
                        student.EnMark = value
                    Else
                        MessageBox.Show("Error Converting EnMark to Integer")
                        Exit Sub
                    End If

                    strValue = sr.ReadLine().Trim("[]")
                    If Integer.TryParse(strValue, value) Then
                        student.MaMark = value
                    Else
                        MessageBox.Show("Error Converting MaMark to Integer")
                        Exit Sub
                    End If

                    Students.Add(student)
                Catch ex As Exception
                    MessageBox.Show("Error reading file. All records may not have been created.")
                End Try
            End While

            MessageBox.Show("Done!")
        End Using


    End Sub

    Private Class StudInfo
        Public FName As String
        Public LName As String
        Public StudentId As Integer
        Public ScMark As Integer
        Public EnMark As Integer
        Public MaMark As Integer
    End Class

End Class

答案 2 :(得分:0)

这取决于文本文件的确切格式。

如果文件只包含两个学生的数据(没有括号或空行),那么您需要做的就是打开文件并读取6行,将数据添加到您的结构中。并阅读接下来的6行。如果您在文本文件中有不确定数量的学生,那么您最好使用List。另外,你每次想要添加一个学生时都需要额外的处理时间来Redim数组,并跟踪数组大小各种各样的混乱。

然而。让我们用最简单的答案,假设你的数据没有括号或空行,并且只有两个学生。

此代码应该可以正常工作。如果你有一定数量的学生,那么你需要改变Students数组的大小。

我还假设数据格式正确,并且不存在非数字字符。

Private Sub ReadStudentInfo()
    'create an array that hold student details
    Dim Students(2) As StudInfo
    Dim index As Integer = 0
    ' read from text file 
    Dim datafile As New StreamReader("some.text")

    Do Until datafile.EndOfStream
        Dim tempStudent As StudInfo
        With tempStudent
            Integer.TryParse(datafile.ReadLine, .StudentId)
            .FName = datafile.ReadLine
            .LName = datafile.ReadLine
            Integer.TryParse(datafile.ReadLine, .ScMark)
            Integer.TryParse(datafile.ReadLine, .EnMark)
            Integer.TryParse(datafile.ReadLine, .MaMark)
        End With
        Students(index) = tempStudent
        index = index + 1
    Loop
End Sub

如果您的文本文件包含空行,则只需插入

            datafile.ReadLine()
每行数据之间的

- 像这样

            Integer.TryParse(datafile.ReadLine, .ScMark)
            datafile.ReadLine()
            Integer.TryParse(datafile.ReadLine, .EnMark)

如果文本文件中有括号,则需要添加额外的代码才能删除它们。