Read multiple lines from textfile into array

Обновить

November 2018

Просмотры

2.9k раз

0

Я работаю на небольшую программу, которая содержит информацию о людях. Информация хранится в текстовом файле в качестве предложения и слова отделены друг от друга «;». Я знаю, как читать строки с StreamReader, я делаю это при нажатии на кнопку. Я тогда разделить предложение на словах и сохранить их в массиве. При нажатии на вторую кнопку, я хочу, чтобы отдельные слова, отображаемые в различных текстовых (их имя, дату рождения и т.д.). И каждый раз, когда вы нажимаете на кнопку информацию следующего человека который отображается до тех пор, пока не появится весь список.

Проблема я сталкиваюсь, что только последнее значение моего массива отображается в текстовых полях. Я понимаю, что каждый раз, когда петля I над 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

Вы можете использовать , 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");
  }
}

Естественно, чтение через файл, чтобы получить конкретную линию не является эффективным, но это то, что вам нужно сделать, если вы не хотите, чтобы строки в списке. (Файлы не линий на основе (или даже характер на основе), так что нет никакого способа, чтобы получить определенную линию без прочтения предыдущих строк.)

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при чтении / записи файлов, это действительно удобно!