Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 熟悉编程语言,需要帮助将.dat文件读入数组Vs VB控制台.net框架_Vb.net_Visual Studio 2019 - Fatal编程技术网

Vb.net 熟悉编程语言,需要帮助将.dat文件读入数组Vs VB控制台.net框架

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

我试图从一个名为TXT.dat的数据文件中读取数据,并使用我使用的命令类型将带圆圈的值存储到一个单独的数组中。我不能使用streamreader,streamwriter这是我在大学里学到的,但我们被教导读取数组,而不是特定的值,因为我将使用一个 从单个文件中提取2个阶乘值,并在两个数组中存储int

在去付费网站之前,我已经花了好几个小时尝试,这些网站总是用I/o streamreader来回答问题,但这并没有帮助

我的代码

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()
方法创建数组并将其返回给调用函数

而且没有人再使用那种古老的/ganky
FileOpen()
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()
?我当然可以更新这段代码以使用旧的遗留函数。您会事先知道数据文件中的行数吗?