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

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,真的很方便!