【问题标题】:VB.net program hangs when asked to read .txtVB.net 程序在被要求读取 .txt 时挂起
【发布时间】:2015-04-14 01:36:58
【问题描述】:

我正在尝试读取一个我用单独的程序成功编写的 .txt 文件,但我一直让程序停止运行(也就是根本没有输入/输出,就像它有一个无限循环之类的东西)。我收到消息“A”,但没有其他消息。

我在类似这样的网站上看到过很多帖子,其中列出了从文件中读取的各种创造性方法,但我发现的每个指南都希望我更改 Msgbox A 和 Msgbox D 之间的代码。没有一个他们改变了结果,所以我开始认为问题实际上在于我如何指出文件的位置。有一个代码(与Dim objReader As New System.IO.TextReader(FileLoc) 有关),但是当我要求读取文件时,我得到了文件的地址。这就是为什么我怀疑我指向 .txt 错误。有一个问题...

如果我做错了,我完全不知道该怎么做。

我在最后附上了代码的 sn-p(每行无关的数据都从中提取出来)。

如果重要的话,实际程序的位置在“G01-Cartography”文件夹中。

  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

【问题讨论】:

  • 使用 MsgBox() 是一种非常危险的代码调试方式。它会导致重新进入,例如,您的 Shown 事件将在 Load 完成之前触发。您需要学习在调试器中使用断点。以及调试器的调用堆栈窗口,以找出您的代码挂起的原因。花点时间学习基本技能。
  • 好吧,在那种情况下,什么是“重新进入”,什么是“调用堆栈”,加载部分的重点不就是加载东西吗?如果您能找到一些解释这一点的链接,我将不胜感激。
  • 这是一件非常糟糕的事情。集中精力,先学习如何使用调试器。
  • @Rettro 它挂在哪里?显示了哪些消息框?
  • @mikek3332002 我得到“A”,但不是其他人。我在表述问题时不小心删掉了该信息,并重新添加到原始帖子中。

标签: vb.net streamreader


【解决方案1】:

运行它会在调试器中显示什么?你能在记事本中打开 Map_Cygnus.txt 文件吗?在第一行设置断点,然后运行程序看看发生了什么。

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

【讨论】:

  • 它在调试器中显示的内容...不知道。现在正在尝试学习如何使用它。 txt 里面确实有正确的数据,我用记事本打开时可以看到它。可能需要几天的时间,但当我弄清楚调试器时,我会回复你。
  • 与此同时,您可以运行上面的代码并查看在您的即时窗口中显示的内容(Debug.Print 语句将在那里添加一行)。要查看即时窗口,请选择 Debug->Windows->Immediate。
【解决方案2】:

根据MSDN,您似乎使用了正确的方法/对象。 您的代码在新的 VB 控制台应用程序 (.net 4.5) 中为我运行

与 MSGBOX 不同的方法是使用 Debug.WriteLine 或 Console.WriteLine。

  • 如果 MSGBOX A 显示但 B 不显示,则问题在于构建流阅读器。
    • 可能您正在查看应用程序的输出,但调试器 (visual studio) 已停止该行上的应用程序,但有一个例外。例如,未找到文件、无权限、使用 http uri...
  • 如果 MSGBOX C 没有显示,那么问题可能是文件读取有问题。
    • 权限?
    • 是否有一行文字?
    • 文件夹是否“在线”
  • 如果 MSGBOX D 显示,但没有任何反应,那么您对 ​​WholeMap 无能为力
    • 如果您将MsgBox("C") 改写为Debug.WriteLine("Read " + WholeMap),请查看显示的内容

【讨论】:

  • 我不小心把那条线剪掉了……“A”显示,但其他三个没有。目前正在尝试找出调试器。我可以打开 txt 文件,里面确实有数据,一行数字和符号(这是我放在那里的)
【解决方案3】:

我有一些建议。首先,使用Option Strict On,它将帮助您避免以后的头痛。

打开文件的代码是正确的。除了避免使用MsgBox() 进行调试,而是设置断点或使用Debug.WriteLine(),将子例程包装在Try...Catch 异常中。

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

请注意,您通常应该只捕获您期望的任何异常,但我通常会在调试此类事件时捕获所有异常。

我还想指出,您只是将文件中的一行读入变量WholeMap。一旦End Using 行被击中,该变量就会失去作用域,从而丢失您刚刚从文件中读取的行。我假设你有这种方式的代码,因为它似乎给你阅读它带来了麻烦,但我想我还是会指出来。

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

【讨论】:

  • 我实际上确实有选项 strict,它只是代码中的更高,所以它没有进入这个 sn-p。
  • (显然你必须换行才能得到一个新行,输入只是发布它,你只能编辑 5 分钟。谁知道。)我正在尝试进行那种调试现在行的东西,但可能需要一点时间才能弄清楚。我相信你可以说我不是为了谋生而做这件事的。如果你能指点我一些关于这些东西的指南,我会很感激的。该文件应该只有一行,它是一个坐标流(“1,3.5,3.16,3”等),但我不知道使用关闭时数据会丢失。老实说,我不知道 using 是做什么的,这只是我迄今为止发现的最不失败的方法。
  • Using 命令只是让您打开诸如文件之类的资源,当执行到 End Using 时,它会关闭文件并为您处理资源。不是 Using 丢失数据,而是您在 using 块内对 WholeMap 变量进行调光。我已经编辑了我的答案以向您展示我的意思。
  • 另外,至于调试文件为什么给你带来麻烦,通过右键单击,选择断点,插入断点,在LoadMap()方法内设置一个断点,然后运行代码。当它到达您设置断点的行时,使用 F11(默认)让代码逐行运行。我敢打赌,用 try catch 包裹它,它会告诉你是什么导致它挂起/崩溃。
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-26
相关资源
最近更新 更多