读取和写入数据到顺序访问文本文件
我有一个任务是在Microsoft Visual Studio Express 2012中创建一个程序,该程序打开我们创建的文本文件,并读取其中已有名称的列表。该程序应该取名称并将它们存储在一个字符串数组中,然后将它们显示在列表框中。还有一个文本框为数组添加一个名称,当程序关闭程序时应该保存数组中的名称列表。我的主要问题如下:读取和写入数据到顺序访问文本文件
如何从阵列获取的名称列表在程序启动
显示如何从文本框中添加名字到已经存在的阵列
如何将数组(带有新名称)保存到文件中?
它是一个在线课程,教师从不电子邮件回来,我们没有课本,我都可以在网络中同时向四周看了看,所以我来到这里,看看有什么我可以找出。
这是我到目前为止有:
问题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
因为我不知道是什么你的知识水平,让我从头开始。
1a)您从Form
开始,并且您有几个控件。您列出的要求是,您必须在程序打开时阅读文件。在VS2012中,在设计器模式下,当您单击表单的顶部栏时,表单的属性出现在属性框中。在属性面板中,沿着顶部边缘,您将看到一个闪电图标。点击它将显示所选控件的所有可能事件的列表(在本例中为Form
)。其中一个事件是Load
。如果你双击Load
它会在代码中为你创建一个新的事件处理程序方法并跳转到它。
这看起来似乎是您的第一个问题的第一部分的最佳解决方案。
1b)至于从文件中读取列表,我认为这个列表是换行符分隔的吗?意思是每行有一个名字。如果是这样,我建议你看看System.IO
in the File
class。 ReadLines()
method将非常有帮助。
ReadLines()
会给你一个文件中每一行的集合(或列表)。如果每个名称位于不同的行上,则集合中的每个项目都将是一个名称。
1c)一旦您收集了名称,您必须将它们添加到ListBox
。查看ListBox
的Items
property。这两种方法对你有帮助的是Add()
and AddRange()
。
2)一旦将名称列入列表中,您可以继续在控件上使用Add()
来更新ListBox
。你有一个TextBox
用于输入新的名字,并且我假定一个按钮实际上是添加的。同样,ListBox
Items
属性上的Add()
方法应该对此有用。
3a)为了从ListBox
得到回线,有几种方法可以做到这一点。我最喜欢的是使用System.Linq
library。在.NET中使用Linq
可轻松处理对象集合。值得注意的是,ListBox
控件Items
属性包含Object
类型的集合。对于视觉表示,ListBox
内部调用每个对象的ToString()
方法。很明显,如果集合中的对象实际上是String
类型,那么它很容易转换。这是你在这里的情况。
即便如此,您需要拨打Cast()
method。
Dim line As String() = listbox.Items.Cast(Of String)().ToArray()
此行将首先将列表框中的所有项目转换为字符串,然后将该列表转换为数组。
3b)最后,您可以使用System.IO.File
类中的WriteAllLines()
method轻松地将该数组写回文件。
UPDATE
这解决你的问题更新:
的File.AppendText()
打开要添加的文件文本。您的文件已经有一些名称,并且列表框包含所有名称。追加并不是正确的答案。
此外,由于在您的示例中names
是一个集合,要编写名称,您需要遍历它们。 注意:最佳做法是对具有Dispose()
方法的对象使用Using
声明。这些对象实现Interface
,称为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()
:
IO.File.WriteAllLines("Names.txt", names)
这一行:
- 打开文件进行写入。如果它不存在,则创建它。
- 将
names
集合中的每个项目写入文件中它自己的行。 - 关闭文件。
System.String []获取保存,而不是输入的实际名称。 – Stromboli
执行写入的代码行是什么?您可以添加更新到您的问题,并在这里留言。 – jwatts1980
@Stromboli你知道吗? – jwatts1980
您是否需要使用'IO.StreamWriter'库? – jwatts1980
我已更新我的回答 – jwatts1980