从文本文件中读取多行到数组

时间:2015-03-04 23:02:53

标签: c# arrays loops streamreader

我正在制作一个包含有关人员信息的小程序。信息作为句子存储在文本文件中,单词用“;”分隔。我知道如何用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");
}

2 个答案:

答案 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,非常方便!