Сортировка записей в текстовом файле
Задача темы: изучить методику и получить навыки в разработке функциональности приложений, использующих данные текстового файла для просмотра и сортировки по шаблону.
Разработка: Приложение "Сортировка списка" для просмотра и сортировки текстового списка по шаблону.
Состав выполняемых функций:
- Файловые операции: открыть, сохранить, закрыть
- Алгоритмы: преобразование вводимого текста в верхний регистр, до-бавление и сохранение записей в файле, удаление записей из загруженного списка, сортировка записей загруженного списка по шаблону
- Информационно-справочные: нет
Наращивание функциональности не предусматривается.
Защита данных предусматривается только от неквалифицированных действий пользователей.
В качестве входных данных используется текстовой файл Список.txt. Выходные данные программы – графическое отображение результатов в листбоксах – для исходного и отсортированных списков, в форме для SmartDevice.
Шаг 1. Разработка графического интерфейса
Используется только одна форма Form1 с текстовым полем, кнопкой добавления записей в текстовой файл, кнопкой загрузки данных текстового файла в listBox1 и кнопкой сортировки и загрузки данных из listBox1 в listBox2. Примерный дизайн формы приведен на рис.5.1.
Шаг 2. Расширяем состав системных библиотек
using System; using System.Drawing; using System.Collections; using System.Windows.Forms; using System.Data; //добавляем библиотеку using System.IO;
Шаг 3. Тестируем наличие файла Список.txt в public Form1()
InitializeComponent(); // после этой строки вставляем: /* Тестируем наличие файла с данными о сотрудниках и создаем файл для записи значений */ FileStream fin; try { fin=new FileStream("Список.txt",FileMode.OpenOrCreate); fin.Close(); } catch(IOException exc) { MessageBox.Show ("Невозможно открыть файл.","Ошибка"); return; }
Шаг 4. Создаем процедуру ввода новых записей в файл
Для кнопки "Добавить в список" пишем:
private void button1_Click_1(object sender, System.EventArgs e) {// Проверяем пустое поле if (textBox1.Text!=" ") {// если поле не пустое //Автоматически переводим текст в верхний регистр string s=textBox1.Text.Trim().ToUpper()+"\r\n"; // открываем файл для записи StreamWriter fin_out; try { fin_out=new StreamWriter("Список.txt", true); } catch(IOException exc) { MessageBox.Show ("Невозможно открыть файл.","Ошибка"); return;} fin_out.Write(s); // записываем в файл новую строку fin_out.Close(); MessageBox.Show(s,"Запись добавлена"); textBox1.Text=" "; // обнуляем текстовое поле } else { MessageBox.Show("Введите текст!","Ошибка"); return;} }
Шаг 5. Создаем процедуру загрузки данных
Для кнопки "Загрузить" пишем:
private void button3_Click(object sender, System.EventArgs e) { FileStream fin; try { fin=new FileStream("Список.txt",FileMode.Open); } catch(IOException exc) { MessageBox.Show ("Невозможно открыть файл.","Ошибка"); return;} // Считываем значения из файла string s; StreamReader fstr_in=new StreamReader(fin); while((s=fstr_in.ReadLine())!=null) { listBox1.Items.Add(s.Trim().ToUpper()); } fstr_in.Close(); }
Шаг 6. Создаем процедуру удаления записей из listBox1
Для удаления записи из листбокса щелчком мыши пишем:
private void listBox1_SelectedIndexChanged (object sender, System.EventArgs e) {// если листбокс не пустой if (listBox1.SelectedItem != null) // удаляем запись listBox1.Items.Remove(listBox1.SelectedItem.ToString()); }
Шаг 7. Создаем процедуру сортировки по шаблону
Для кнопки "Сортировать" пишем:
private void button2_Click(object sender, System.EventArgs e) { listBox2.Items.Clear(); // чистим листбокс 2 if (listBox1.Items.Count!=0) {/* если число сторк в листбокс 1 не равно 0, создаем константу шаблона сортировки. Кстати, константу можно создать и в другом месте программы. */ const string s_alfa="АБВГДЕЖЗИКЛМНОПРСТУФХЦШЩЭЮЯ"; // вычисляем длину выбранной строки из алфавита for (int it=0;it<s_alfa.Length; it++) { string s_sym=s_alfa.Substring(it,1); string s_name=s_sym; // Вложенный цикл поиска повторений do-while do { // вложенный цикл просмотра списка листбокса for(int i=0; i<listBox1.Items.Count;i++) // сравниваем значения алфавита и листбокса {s_name=listBox1.Items[i].ToString().Substring(0,1); if (s_sym==s_name) { int i_row=i; if (i_row<=listBox1.Items.Count) { string s_new=listBox1.Items[i_row].ToString(); listBox2.Items.Add(s_new); listBox1.Items.Remove(listBox1.Items[i_row].ToString());} } } } while (s_sym==s_name & listBox1.Items.Count!=0); } } else {// если листбокс1 пустой, то MessageBox.Show("Введите текст!","Ошибка"); return;} }