VB.NET .txt文件操作

时间:2017-04-08 14:27:23

标签: vb.net

目前正在开展一个学校项目,我们在tocode(在vb.net中)编写了一个程序,该程序读取具有不同点的x和y坐标的txt文件,并在每两个点之间进行距离计算,并在文件上写入距离。

txt文件如下所示:

596;226  
506;179  
412;298  
583;291   
...etc

所以我的目标是计算dx和dy(每两行坐标之间的差异),这样我就可以得到距离。

唯一的问题是我被困在如何获得dx和dy(现在7天) 例如,对于第1行和第2行,dx为(506-596),第2行为(412-506),对于所有具有dy的点也是如此。

这是我一直在徒劳的尝试(大多数代码只是从网上复制/粘贴)。

Imports System.IO

Public Class Form1


Private Sub FichierTexteToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FichierTexteToolStripMenuItem.Click

    OpenFileDialog1.Filter = "fichier texte| *.txt"
    Dim nbLigne As Integer
    nbLigne = 0
    If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
        Dim sr As StreamReader
        sr = New StreamReader(OpenFileDialog1.FileName)
        Dim x, y As String
        Dim dx, dy As String
        Dim txtTotal As Object
        Dim ligne = sr.ReadLine()
        Dim tabl() As Object
        tabl = Split(ligne, ";") 'la taille de tableau represente le nombre de bloc qui ksont séparer par les separateur
        txtTotal = ligne + vbCrLf


        'While Not ligne Is Nothing
        '    ligne = sr.ReadLine
        '    txtTotal = txtTotal + ligne + vbCrLf

        '    tabl = Split(ligne, ";") 'la taille de tableau represente le nombre de bloc qui ksont séparer par les separateur
        '    nbLigne = nbLigne + 1
        'End While
        x = tabl(0)
        y = tabl(1)

        While Not ligne Is Nothing
            ligne = sr.ReadLine

            tabl = Split(ligne, ";")
            dx = tabl(0) - x
            dy = tabl(1) - y

        End While


        'test
        Label2.Text = dx
        Label3.Text = dy

        'Label1.Text = Calculs.distance(dx, dy)

    Else : Close()

    End If

End Sub



End Class

谢谢,希望有人能帮我解决这个问题:)

2 个答案:

答案 0 :(得分:0)

您应该声明

Dim tabl() As String

因为函数Split返回一个String数组。你不能用字符串做数学计算。所以你必须将所有字符串转换为数字。例如。到Double

dxdy需要为数字

Dim dx = Double.Parse(tabl(0)) - Double.Parse(x)
Dim dy = Doubel.Parse(tabl(1)) - Double.Parse(y)

通过将读取和转换部分提取到单独的函数中,可以使代码更清晰。在这个例子中,我还添加了一些有效性检查

Private Function TryReadCoords(sr As StreamReader, ByRef x As Double, ByRef y As Double) _
    As Boolean

    Dim ligne = sr.ReadLine()
    If String.IsNullOrWhiteSpace(ligne) Then
        Return False
    End If

    Dim parts = Split(ligne, ";")
    Return _
        parts.Length = 2 AndAlso _
        Double.TryParse(parts(0), x) AndAlso _
        Double.TryParse(parts(1), y)
End Function

您可以将StreamReader放入Using语句中。它会在最后自动关闭文件。

使用这个新功能,代码现在看起来更简单:

Using sr As New StreamReader(OpenFileDialog1.FileName)
    Dim x0, y0, x1, y1 As Double

    If TryReadCoords(sr, x0, y0) Then
        While TryReadCoords(sr, x1, y1)
            Dim dx = x1 - x0
            Dim dy = y1 - y0

            'Do calculations here ...

            x0 = x1
            y0 = y1
        End While
    End If
End Using

答案 1 :(得分:0)

VB.Net提供Point * 结构。用那个;当您阅读每一行时,将其解析为Point实例。

当你可以做那么多时,写一个接受两个Point的方法并返回它们之间的距离。这对你有所帮助,因为它会消除所有分散目标的事情或使你感到困惑:

 Public Function Distance(ByVal p1 As Point, ByVal p2 As Point) As Double
     Return Point.Subtract(p1, p2).Length
 End Function

这看起来像是家庭作业,所以你的教授可能期望你做整个作业 √((x₁ - x)² + (y₁ - y₂)²)公式,但是如果你需要在自己的上写,那就是作业的重点。

*请注意,代码示例使用System.Windows.Point而不是System.Drawing.Point,这需要添加对项目的引用