Macukadam
Macukadam

Reputation: 45

Readline Error While Reading From .txt file in vb.net

I have a Streamreader which is trowing an error after checking every line in Daycounts.txt. It is not a stable txt file. String lines in it are not stable. Count of lines increasing or decresing constantly. Thats why I am using a range 0 to 167. But

Here is the content of Daycounts.txt: Daycounts

Dim HourSum as integer
    Private Sub Change()
        Dim R As IO.StreamReader
        R = New IO.StreamReader("Daycounts.txt")
        Dim sum As Integer = 0
        For p = 0 To 167
            Dim a As String = R.ReadLine
            If a.Substring(0, 2) <> "G." Then
                sum += a.Substring(a.Length - 2, 2)
            Else

            End If
        Next
        HourSum = sum
        R.Close()
    End Sub

Upvotes: 0

Views: 702

Answers (1)

Steve
Steve

Reputation: 216273

If you don't know how many lines are present in your text file then you could use the method File.ReadAllLines to load all lines in memory and then apply your logic

Dim HourSum As Integer
Private Sub Change()
    Dim lines = File.ReadAllLines("Daycounts.txt")
    Dim sum As Integer = 0
    For Each line In lines
        If line.Substring(0, 2) <> "G." Then
            sum += Convert.ToInt32(line.Substring(line.Length - 2, 2))
        Else
            ....    
        End If
    Next
    HourSum = sum
End Sub

This is somewhat inefficient because you loop over the lines two times (one to read them in, and one to apply your logic) but with a small set of lines this should be not a big problem

However, you could also use File.ReadLines that start the enumeration of your lines without loading them all in memory. According to this question, ReadLines locks writes your file until the end of your read loop, so, perhaps this could be a better option for you only if you don't have something external to your code writing concurrently to the file.

Dim HourSum As Integer
Private Sub Change()
    Dim sum As Integer = 0
    For Each line In File.ReadLines("Daycounts.txt")
        If line.Substring(0, 2) <> "G." Then
            sum += Convert.ToInt32(line.Substring(line.Length - 2, 2))
        Else
            ....    
        End If
    Next
    HourSum = sum
End Sub

By the way, notice that I have added a conversion to an integer against the loaded line. In your code, the sum operation is applied directly on the string. This could work only if you have Option Strict set to Off for your project. This setting is a very bad practice maintained for VB6 compatibility and should be changed to Option Strict On for new VB.NET projects

Upvotes: 1

Related Questions