读取和写入数据到顺序访问文本文件
Reading and Writing Data to Sequential Access Text File
我有一项任务是在 Microsoft Visual Studio Express 2012 中创建一个程序,该程序打开我们创建的文本文件并读取其中已有的名称列表。该程序应该获取名称并将它们存储在字符串数组中,然后将它们显示到列表框中。还有一个文本框可以将名称添加到数组中,当程序关闭时,程序应将名称列表保存在数组中。我的主要问题如下:
如何从数组中获取姓名列表以在程序启动时显示
如何将文本框中的名字添加到已经存在的数组中
如何获取数组(拖着新名称)并将其保存到文件中?
是在线的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
library。 Linq
是 .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
语句。这些对象实现了一个名为 IDisposable
的 Interface
。 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
集合中的每个项目写入文件中它自己的行。
- 关闭文件。
我有一项任务是在 Microsoft Visual Studio Express 2012 中创建一个程序,该程序打开我们创建的文本文件并读取其中已有的名称列表。该程序应该获取名称并将它们存储在字符串数组中,然后将它们显示到列表框中。还有一个文本框可以将名称添加到数组中,当程序关闭时,程序应将名称列表保存在数组中。我的主要问题如下:
如何从数组中获取姓名列表以在程序启动时显示
如何将文本框中的名字添加到已经存在的数组中
如何获取数组(拖着新名称)并将其保存到文件中?
是在线的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
library。 Linq
是 .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
语句。这些对象实现了一个名为 IDisposable
的 Interface
。 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
集合中的每个项目写入文件中它自己的行。 - 关闭文件。