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

时间:2015-04-06 18:37:15

标签: arrays visual-studio-2012 io streamreader streamwriter

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

  1. 如何从阵列中获取要在程序启动时显示的名称列表

  2. 如何将文本框中的名称添加到现有数组

  3. 如何获取阵列(带有新名称)并将其保存到文件中?

  4. 这是一个在线课程,教师从不发送电子邮件,我们没有教科书,我已经在网上浏览了一段时间,所以我来这里看看我能找到的东西。

    这是我到目前为止所做的:

    问题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
    

    问题2:我甚至不知道从哪里开始

    问题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
    

1 个答案:

答案 0 :(得分:0)

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

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

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

1b)至于从文件中读取列表,我假设这个列表是换行符分隔的吗?意思是每行都有一个名称。如果是这样,我建议您查看System.IO in the File classReadLines() method非常有帮助。

ReadLines()会返回文件中每行的集合(或列表)。如果每个名称在不同的行上,则集合中的每个项目都是名称。

1c)获得名称后,必须将它们添加到ListBox。查看ListBox的{​​{3}}。对您有帮助的两种方法是Items property

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

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

即便如此,您还需要System.Linq library来电。

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

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

3b)最后,您可以使用System.IO.File类中的Cast() method轻松地将该数组写回文件。

<强> 更新

这解决了您的问题更新:

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

此外,由于在您的示例names是一个集合,要编写名称,您需要循环它们。 注意:最佳做法是对具有Using方法的对象使用Dispose()语句。这些对象实现了一个名为Interface的{​​{1}}。 IDisposable语句与实现Using的对象具有特殊关系。它始终确保在调用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()

这一行:

  1. 打开文件进行写入。如果它不存在,则创建它。
  2. IO.File.WriteAllLines("Names.txt", names) 集合中的每个项目写入文件中自己的行。
  3. 关闭文件。