Vb.net 熟悉编程语言,需要帮助将.dat文件读入数组Vs VB控制台.net框架
我试图从一个名为TXT.dat的数据文件中读取数据,并使用我使用的命令类型将带圆圈的值存储到一个单独的数组中。我不能使用streamreader,streamwriter这是我在大学里学到的,但我们被教导读取数组,而不是特定的值,因为我将使用一个 从单个文件中提取2个阶乘值,并在两个数组中存储int 在去付费网站之前,我已经花了好几个小时尝试,这些网站总是用I/o streamreader来回答问题,但这并没有帮助 我的代码Vb.net 熟悉编程语言,需要帮助将.dat文件读入数组Vs VB控制台.net框架,vb.net,visual-studio-2019,Vb.net,Visual Studio 2019,我试图从一个名为TXT.dat的数据文件中读取数据,并使用我使用的命令类型将带圆圈的值存储到一个单独的数组中。我不能使用streamreader,streamwriter这是我在大学里学到的,但我们被教导读取数组,而不是特定的值,因为我将使用一个 从单个文件中提取2个阶乘值,并在两个数组中存储int 在去付费网站之前,我已经花了好几个小时尝试,这些网站总是用I/o streamreader来回答问题,但这并没有帮助 我的代码 Sub Main() Const i_val As Inte
Sub Main()
Const i_val As Integer = 6
Dim j As Integer = 6 'loop readers
Dim Arayn_Fact(i_val - 1) As Double 'array for 2nd value per line
Dim Aray_Fact2n(j - 1) As Double 'array for 4th value per line
Read_Values(i_val - 1, Arayn_Fact)
End Sub
Sub Read_Values(ByVal i As Integer, ByRef _A() As Double)
Dim fid1 As Integer = FreeFile()
Dim fid2 As Integer = FreeFile() + 1
Dim tmp As Double
FileOpen(fid1, "TXT.dat", OpenMode.Input, OpenAccess.Read)
For i = 0 To 5 Step 1
Input(fid1, tmp)
Input(fid1, _A(i))
Next i
FileClose(fid1)
Console.ReadKey()
End Sub
首先,一些风格的东西。传递数组
ByRef
是不正确的。数组已经是引用类型,因此传递ByVal
仍然会将引用传递给数组对象。但一开始甚至都不要通过数组。更好的做法是让Read_Values()
方法创建数组并将其返回给调用函数
而且没有人再使用那种古老的/gankyFileOpen()
API了。我是认真的。不,一个。它甚至不适合教学,因为流
类型更接近低级操作系统/文件系统的功能。如果你不能使用StreamReader和friends,还有更好的选择
Sub Main()
Dim Array_Fact() As Double = Read_Values("TXT.dat", 1)
Dim Array_Fact2n() As Double = Read_Values("TXT.dat", 3)
Console.ReadKey(True)
End Sub
Function Read_Values(filePath As String, position As Integer) As Double()
Dim lines() As String = File.ReadAllLines(filePath) 'Look Ma, no StreamReader
Dim result(lines.Length - 1) As Double
For i As Integer = 0 To Lines.Length - 1
result(i) = Double.Parse(lines(i).Split(",")(position).Trim())
Next line
Return result
End Function
但我真正要做的是将第2个和第4个值保存在同一个集合中,并通过文件一次读取所有内容。它使用了泛型、元组、Lambdas+Linq等功能,这些功能在一段时间内都无法使用,但我觉得它有助于向您展示您的目标:
Sub Main()
Dim Facts = Read_Values("TXT.dat")
Console.WriteLine(String.Join(",",Facts.Select(Function(f) $"({f.Item1}:{f.Item2})")))
Console.ReadKey(True)
End Sub
Function Read_Values(filePath As String) As IEnumerable(Of (Double, Double))
Return File.ReadLines(filePath).Select(
Function(line) 'Poor man's CSV. In real code, I'd pull in a CSV parser from NuGet
Dim fields = line.Split(",")
Return (Double.Parse(fields(1).Trim()), Double.Parse(fields(3).Trim()))
End Function
)
End Function
在不太花哨的情况下,这里有一些非常基本的代码来完成您概述的工作:
Sub Main()
Dim fileName As String = "txt.dat"
Dim Aray_Fact2() As Integer 'array for 2nd value per line
Dim Aray_Fact4() As Integer 'array for 4th value per line
Dim list2 As New List(Of Integer)
Dim list4 As New List(Of Integer)
Dim lines() As String = System.IO.File.ReadAllLines(fileName)
For Each line As String In lines
Dim values() As String = line.Split(",")
If values.Length >= 3 Then
Dim f2, f4 As Integer
If Integer.TryParse(values(1), f2) AndAlso Integer.TryParse(values(3), f4) Then
list2.Add(f2)
list4.Add(f4)
Else
Console.WriteLine("Invalid value in line: " & line)
End If
Else
Console.WriteLine("Invalid number of entries in line: " & line)
End If
Next
Aray_Fact2 = list2.ToArray
Aray_Fact4 = list4.ToArray
Console.WriteLine("Aray_Fact2: " & String.Join(",", Aray_Fact2))
Console.WriteLine("Aray_Fact4: " & String.Join(",", Aray_Fact4))
Console.Write("Press Enter to Quit...")
Console.ReadLine()
End Sub
如果您完全反对使用列表和ToArray,那么您必须将该文件读取两次。一次,确定文件中有多少行,以便将数组尺寸标注为正确的大小。然后是另一次实际读取值并填充数组的时间。如果您不能使用streamreader,那么您应该使用一些特定的东西吗?除非你被要求使用它们,否则我强烈建议你避免使用
FileOpen
和Input
,它们是为.NET之前的VB文件处理提供的传统支持。我不知道他们为什么要你使用VB.NET,然后强迫你使用FreeFile、FileOpen和Input等史前方法。但是,如果您只想从文件中的数据中读取第二列,那么您应该先读取一行中的所有数据(5个输入),然后再从下一行读取输入fileopen()、FileClose()和FreeFile()。它们的存在只是为了与非常旧的代码向后兼容,在新的开发中没有一席之地。如果这是你所在大学的教学内容,那就找一所新的大学。是的,把@JoelCoehoorn comment的最后一句话也添加到我的评论中。“我与大学教授的程序员的经验是,他们需要一年或更长的时间才能忘却大学教给他们的所有不良做法;并掌握行业中实际编程的现实。”罗伯特。C.Martin(Bob叔叔)我正在使用的命令目前在ENGG1002中教授。我使用了streamreader,这是我上一次的作业,被扣掉了很多。是的……我不知道你们的ENGG1002课程允许什么,对不起。您知道是否允许使用System.IO.File.ReadAllLines()
?我当然可以更新这段代码以使用旧的遗留函数。您会事先知道数据文件中的行数吗?