我正在制作一个包含有关人员信息的小程序。信息作为句子存储在文本文件中,单词用“;”分隔。我知道如何用streamreader读取行,我点击按钮就可以了。 然后我用句子分割句子并将它们保存在一个数组中。 单击第二个按钮时,我希望在不同的文本框中显示单独的单词(其名称,出生日期等)。每次单击该按钮时,都会显示下一个人的信息,直到显示整个列表。
我遇到的问题是只有我的数组的最后一个值显示在文本框中。据我所知,每次循环读取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");
}
答案 0 :(得分:0)
您可以使用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");
}
}
自然地阅读文件以获得特定的行并不高效,但如果您不想将这些行保留在列表中,则必须执行此操作。 (文件不是基于行的(甚至是基于字符的),因此如果不读取前面的行,就无法获取特定的行。)
答案 1 :(得分:0)
您不必逐个读取行。
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]
从第1行获取值,您知道某些名称位于第1列。
所以,对于按钮:
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");
}
另外,在读/写文件时使用using
,非常方便!