文本文件包含以下内容:在[]内部,()内的任何内容都不在文本文件中,只是为了澄清
[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
谢谢。
答案 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)
如果文本文件中有括号,则需要添加额外的代码才能删除它们。