Rettro
Rettro

Reputation: 21

VB.net program hangs when asked to read .txt

I am attempting to read a .txt file that I successfully wrote with a separate program, but I keep getting the program stalling (aka no input/output at all, like it had an infinite loop or something). I get the message "A", but no others.

I've seen a lot of threads on sites like this one that list all sorts of creative ways to read from a file, but every guide I have found wants me to change the code between Msgbox A and Msgbox D. None of them change the result, so I'm beginning to think that the issue is actually with how I'm pointing out the file's location. There was one code (had something to do with Dim objReader As New System.IO.TextReader(FileLoc)), but when I asked for a read of the file I got the file's address instead. That's why I suspect I'm pointing to the .txt wrong. There is one issue...

I have absolutely no idea how to do this, if what I've done is wrong.

I've attached at the end the snippet of code (with every single line of extraneous data ripped out of it).

If it matters, the location of the actual program is in the "G01-Cartography" folder.

  Private Sub GameMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
   LoadMap("Map_Cygnus.txt")
 End Sub

  Private Sub LoadMap(FileLoc As String)
   FileLoc = "C:\Users\Adam\Documents\Visual Studio 2013\Projects\G01-Cartography\Maps\" + FileLoc
    MsgBox("A")
    Using File As New StreamReader(FileLoc)
        MsgBox("B")
        Dim WholeMap = File.ReadLine()
        MsgBox("C")
    End Using
    MsgBox("D")
  End Sub

Upvotes: 1

Views: 543

Answers (3)

RianBattle
RianBattle

Reputation: 898

I have a few suggestions. Firstly, use Option Strict On, it will help you to avoid headaches down the road.

The code to open the file is correct. In addition to avoiding using MsgBox() to debug and instead setting breakpoints or using Debug.WriteLine(), wrap the subroutine in a Try...Catch exception.

Private Sub GameMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    LoadMap("Map_Cygnus.txt")
End Sub

Private Sub LoadMap(FileLoc As String)
    Try
        FileLoc = "C:\Users\Adam\Documents\Visual Studio 2013\Projects\G01-Cartography\Maps\" + FileLoc
        MsgBox("A")
        Using File As New StreamReader(FileLoc)
            MsgBox("B")
            Dim WholeMap = File.ReadLine()         'dimming a variable inside a block like this means the variable only has scope while inside the block
            MsgBox("C")
        End Using
        MsgBox("D")
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

Note that you normally should only catch whatever exceptions you expect, but I generally catch everything while debugging things like this.

I would also like to point out that you are only reading one line out of the file into the variable WholeMap. That variable loses scope as soon as the End Using line is hit, thereby losing the line you just read from the file. I'm assuming that you have the code in this way because it seems to be giving you trouble reading from it, but thought I would point it out anyway.

Public Class GameMain
    Private WholeMap As String = ""

    Private Sub GameMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        LoadMap("Map_Cygnus.txt")
    End Sub

    Private Sub LoadMap(FileLoc As String)
        Try
            FileLoc = "C:\Users\Adam\Documents\Visual Studio 2013\Projects\G01-Cartography\Maps\" + FileLoc
            Using File As New StreamReader(FileLoc)
                WholeMap = File.ReadLine()         'dimming the variable above will give all of your subs inside class Form1 access to the contents of it (note that I've removed the Dim command here)
            End Using
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
End Class

Upvotes: 0

mikek3332002
mikek3332002

Reputation: 3562

It looks like you're using the correct methods/objects according to MSDN. Your code runs for me in an new VB console app(.net 4.5)

A different approach then MSGBOXs would be to use Debug.WriteLine or Console.WriteLine.

  • If MSGBOX A shows but not B, then the problem is in constructing the stream reader.
    • Probably you are watching the application for output but the debugger(visual studio) has stopped the application on that line, with an exception. eg File not found, No Permission, using a http uri...
  • If MSGBOX C doesn't show then problem is probably that the file has problems being read.
    • Permissions?
    • Does it have a Line of Text?
    • Is the folder 'online'
  • If MSGBOX D shows, but nothing happens then you are doing nothing with WholeMap
    • See what is displayed if you rewite MsgBox("C") to Debug.WriteLine("Read " + WholeMap)

Upvotes: 1

Craig Johnson
Craig Johnson

Reputation: 754

What does running this show you in the debugger? Can you open the Map_Cygnus.txt file in Notepad? Set a breakpoint on the first line and run the program to see what is going on.

Private BaseDirectory As String = "C:\Users\Adam\Documents\Visual Studio 2013\Projects\G01-Cartography\Maps\"

Private Sub GameMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Dim WholeMap = File.ReadAllText(Path.Combine(BaseDirectory, "Map_Cygnus.txt"))
    Debug.Print("Size Of Map: {0}", WholeMap.Length)
End Sub

Upvotes: 1

Related Questions