从文本文件中读取多行到数组
Read multiple lines from textfile into array
我正在开发一个保存有关人的信息的小程序。信息以句子的形式存储在文本文件中,单词之间用“;”分隔。我知道如何使用流式阅读器阅读台词,我通过单击按钮来执行此操作。
然后我将句子拆分成单词并将它们保存在一个数组中。
单击第二个按钮时,我希望在不同的文本框中显示单独的单词(他们的名字、出生日期等)。每次点击按钮都会显示下一个人的信息,直到显示整个列表。
我遇到的问题是文本框中只显示数组的最后一个值。我知道每次我遍历 readline() 时,数组都会被字符串填充并被覆盖。我暂时不想使用列表,因为我已经找到了列表的答案。我只是找不到一种方法来将我的信息保存在数组中并稍后显示。
我会把我的代码放在这里:
string[] words = new string[10];
private void btnInput_Click(object sender, EventArgs e)
{
string line = "";
try
{
StreamReader file = new StreamReader("pers.txt");
while (file.Peek() != -1)
{
line = file.ReadLine();
words = line.Split(';');
}
file.Close();
MessageBox.Show("File read", "Info");
}
catch (FileNotFoundException ex)
{
MessageBox.Show(ex.Message, "File not found");
return;
}
}
private void btnOutput_Click(object sender, EventArgs e)
{
txtName.Text = words[0];
txtdate.Text = words[1];
txtNr.Text = words[2];
txtStreet.Text = words[3];
txtPost.Text = words[4];
txtCity.Text = words[5];
MessageBox.Show("All persons showed", "Info");
}
您可以使用 File.ReadLines
来枚举行,而无需将整个文件读入数组。保留当前行的索引并跳到该行,并增加索引以在下次获取下一行:
int index = 0;
string[] words;
private void btnInput_Click(object sender, EventArgs e) {
try {
string line = File.ReadLines("pers.txt").Skip(index).FirstOrDefault();
if (line != null) {
words = line.Split(';');
index++;
} else {
// reached the end of the file
}
MessageBox.Show("File read", "Info");
} catch (FileNotFoundException ex) {
MessageBox.Show(ex.Message, "File not found");
}
}
自然地通读文件以获取特定行效率不高,但如果您不想将这些行保留在列表中,则必须这样做。 (文件不是基于行的(甚至不是基于字符的),因此如果不阅读前面的行就无法获取特定的行。)
您不必逐行阅读。
string[][] words = null;
private void btnInput_Click(object sender, EventArgs e)
{
string line = "", contents = "";
try
{
using (StreamReader file = new StreamReader("pers.txt"))
{
contents = file.ReadToEnd();
}
string[] lines = contents.Split(new string[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);
words = new string[lines.GetLength(0)][];
for (int i = 0; i < lines.GetLength(0); i++)
{
string[] split_words = lines[i].Split(new char[] { ';' });
words[i] = new string[split_words.GetLength(0)];
for (int j = 0; j < split_words.GetLength(0); j++)
words[i][j] = split_words[j];
}
MessageBox.Show("File read", "Info");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "File not found");
return;
}
}
声明一个交错的数组string[][] words = null;
将允许您通过索引来寻址任何特定行上的每个单词。例如。 string name = words[0][0]
从第一行获取一个值,您知道某个名称位于第一列。
因此,对于按钮:
int current_index = -1;
private void btnOutput_Click(object sender, EventArgs e)
{
current_index = words.GetLength(0) == current_index - 1 ? 0 : ++current_index;
txtName.Text = words[current_index][0];
txtdate.Text = words[current_index][1];
txtNr.Text = words[current_index][2];
txtStreet.Text = words[current_index][3];
txtPost.Text = words[current_index][4];
txtCity.Text = words[current_index][5];
MessageBox.Show("All persons showed", "Info");
}
另外,当reading/writing个文件时使用using
,真的很方便!
我正在开发一个保存有关人的信息的小程序。信息以句子的形式存储在文本文件中,单词之间用“;”分隔。我知道如何使用流式阅读器阅读台词,我通过单击按钮来执行此操作。 然后我将句子拆分成单词并将它们保存在一个数组中。 单击第二个按钮时,我希望在不同的文本框中显示单独的单词(他们的名字、出生日期等)。每次点击按钮都会显示下一个人的信息,直到显示整个列表。
我遇到的问题是文本框中只显示数组的最后一个值。我知道每次我遍历 readline() 时,数组都会被字符串填充并被覆盖。我暂时不想使用列表,因为我已经找到了列表的答案。我只是找不到一种方法来将我的信息保存在数组中并稍后显示。
我会把我的代码放在这里:
string[] words = new string[10];
private void btnInput_Click(object sender, EventArgs e)
{
string line = "";
try
{
StreamReader file = new StreamReader("pers.txt");
while (file.Peek() != -1)
{
line = file.ReadLine();
words = line.Split(';');
}
file.Close();
MessageBox.Show("File read", "Info");
}
catch (FileNotFoundException ex)
{
MessageBox.Show(ex.Message, "File not found");
return;
}
}
private void btnOutput_Click(object sender, EventArgs e)
{
txtName.Text = words[0];
txtdate.Text = words[1];
txtNr.Text = words[2];
txtStreet.Text = words[3];
txtPost.Text = words[4];
txtCity.Text = words[5];
MessageBox.Show("All persons showed", "Info");
}
您可以使用 File.ReadLines
来枚举行,而无需将整个文件读入数组。保留当前行的索引并跳到该行,并增加索引以在下次获取下一行:
int index = 0;
string[] words;
private void btnInput_Click(object sender, EventArgs e) {
try {
string line = File.ReadLines("pers.txt").Skip(index).FirstOrDefault();
if (line != null) {
words = line.Split(';');
index++;
} else {
// reached the end of the file
}
MessageBox.Show("File read", "Info");
} catch (FileNotFoundException ex) {
MessageBox.Show(ex.Message, "File not found");
}
}
自然地通读文件以获取特定行效率不高,但如果您不想将这些行保留在列表中,则必须这样做。 (文件不是基于行的(甚至不是基于字符的),因此如果不阅读前面的行就无法获取特定的行。)
您不必逐行阅读。
string[][] words = null;
private void btnInput_Click(object sender, EventArgs e)
{
string line = "", contents = "";
try
{
using (StreamReader file = new StreamReader("pers.txt"))
{
contents = file.ReadToEnd();
}
string[] lines = contents.Split(new string[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);
words = new string[lines.GetLength(0)][];
for (int i = 0; i < lines.GetLength(0); i++)
{
string[] split_words = lines[i].Split(new char[] { ';' });
words[i] = new string[split_words.GetLength(0)];
for (int j = 0; j < split_words.GetLength(0); j++)
words[i][j] = split_words[j];
}
MessageBox.Show("File read", "Info");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "File not found");
return;
}
}
声明一个交错的数组string[][] words = null;
将允许您通过索引来寻址任何特定行上的每个单词。例如。 string name = words[0][0]
从第一行获取一个值,您知道某个名称位于第一列。
因此,对于按钮:
int current_index = -1;
private void btnOutput_Click(object sender, EventArgs e)
{
current_index = words.GetLength(0) == current_index - 1 ? 0 : ++current_index;
txtName.Text = words[current_index][0];
txtdate.Text = words[current_index][1];
txtNr.Text = words[current_index][2];
txtStreet.Text = words[current_index][3];
txtPost.Text = words[current_index][4];
txtCity.Text = words[current_index][5];
MessageBox.Show("All persons showed", "Info");
}
另外,当reading/writing个文件时使用using
,真的很方便!