读取和写入数据到顺序访问文本文件

Reading and Writing Data to Sequential Access Text File

我有一项任务是在 Microsoft Visual Studio Express 2012 中创建一个程序,该程序打开我们创建的文本文件并读取其中已有的名称列表。该程序应该获取名称并将它们存储在字符串数组中,然后将它们显示到列表框中。还有一个文本框可以将名称添加到数组中,当程序关闭时,程序应将名称列表保存在数组中。我的主要问题如下:

  1. 如何从数组中获取姓名列表以在程序启动时显示

  2. 如何将文本框中的名字添加到已经存在的数组中

  3. 如何获取数组(拖着新名称)并将其保存到文件中?

是在线的class,老师从来不回邮件,我们也没有教科书,我在网上看了一段时间,所以我来这里看看我能做些什么找出来。

这是我目前的情况:

问题 1:

Public Class Form1
Dim strReader As System.IO.StreamReader

Private Sub lstNames_SelectedIndexChanged(sender As Object, e As EventArgs)     Handles lstNames.SelectedIndexChanged
    strReader = New IO.StreamReader("Names.txt")
    While (strReader.Peek() > -1)
        lstNames.Items.Add(strReader.ReadLine)
    End While
    strReader.Close()
    Dim nameArray() As String = lstNames.Items.OfType(Of String)().ToArray()
End Sub

问题二:不知从何说起[=13​​=]

问题 3:

Private Sub saveExit_Click(sender As Object, e As EventArgs) Handles    saveExit.Click
    Dim strWriter As New IO.StreamWriter("Names.txt")
    strWriter.Write(lstNames.Text)
    strWriter.Close()
    Application.Exit()
End Sub

现在,作者将只保存文本文件,没有任何内容,因为目前我无法在启动时将名称数组加载到列表框中。感谢所有评论的人,感谢您的帮助!

编辑:现在唯一的问题是更新列表框信息没有正确保存数据,它返回为 System.String[] 这里是代码:

  Private Sub saveExit_Click(sender As Object, e As EventArgs) Handles saveExit.Click
    'this converts all items in listbox into strings, then into an array
    Dim names As String() = lstNames.Items.Cast(Of String)().ToArray()
    'This writes the data to the file
    Dim strWriter As IO.StreamWriter = IO.File.AppendText("Names.txt")
    strWriter.WriteLine(names)
    strWriter.Close()
    Application.Exit()
End Sub

由于不知道你的知识水平如何,所以让我从头开始。

1a) 您从 Form 开始,并且您有多个控件。您列出的要求是您必须在程序打开时读取文件。在 VS2012 中,在设计器模式下,当您单击窗体的顶部栏时,窗体的属性会出现在 属性 框中。在 属性 面板的顶部边缘,您会看到一个闪电图标。单击它将显示所选控件的所有可能事件的列表(在本例中为 Form)。其中一个事件是 Load。如果您双击 Load,它将在代码中为您创建一个新的事件处理程序方法并跳转到该方法。

这似乎是您第一个问题的第一部分的最佳解决方案。

1b) 至于从文件中读取列表,我假设这个列表是用换行符分隔的?意思是每一行都有一个名字。如果是这样,我建议你看看 System.IO in the File class. The ReadLines() method 会很有帮助。

ReadLines() 将返回文件中每一行的集合(或列表)。如果每个名字都在不同的行上,那么集合中的每个项目都是一个名字。

1c) 收集到姓名后,您必须将它们添加到 ListBox。查看 Items property of the ListBox. The two methods that are going to be helpful for you are Add() and AddRange().

2) 将名称输入列表后,您可以继续在控件上使用 Add() 来更新 ListBox。您有一个 TextBox 用于输入新名称,我假设有一个实际执行添加的按钮。同样,ListBox Items 属性 上的 Add() 方法应该对此有用。

3a) 要从 ListBox 中取回行,有几种方法可以做到这一点。我最喜欢的一种是使用 System.Linq libraryLinq 是 .NET 中轻松处理对象集合的一种方式。需要注意的重要一点是 ListBox 控件 Items 属性 包含 Object 类型的集合。对于视觉表示,ListBox 在内部调用每个对象的 ToString() 方法。显然,如果集合中的对象实际上恰好是 String 类型,那么转换很容易。你这里就是这种情况。

即便如此,您还是需要 Cast() method 电话。

Dim line As String() = listbox.Items.Cast(Of String)().ToArray()

此行将首先将列表框中的所有项目转换为字符串,然后将该列表转换为数组。

3b) 最后,您可以使用 System.IO.File class.

中的 WriteAllLines() method 轻松将该数组写回文件

更新

这解决了您的问题更新:

File.AppendText() 打开一个文件以向其中添加文本。您的文件已经有一些名称,列表框有所有的名称。追加确实不是正确答案。

此外,由于在您的示例中 names 是一个集合,因此要编写名称,您需要遍历它们。 注意:最佳做法是对具有 Dispose() 方法的对象使用 Using 语句。这些对象实现了一个名为 IDisposableInterfaceUsing 语句与实现 IDisposable 的对象有特殊关系。它始终确保在调用 End Using 行时释放所有资源。

Using strWriter As IO.StreamWriter = IO.File.AppendText("Names.txt")
    For Each n As String In names
        strWriter.WriteLine(n)
    Next
    strWriter.Close()
End Using

更好的选择是使用 File.WriteAllLines():

IO.File.WriteAllLines("Names.txt", names)

这一行:

  1. 打开文件进行写入。如果它不存在则创建它。
  2. names 集合中的每个项目写入文件中它自己的行。
  3. 关闭文件。