Сортировка записей в текстовом файле
Задача темы: изучить методику и получить навыки в разработке функциональности приложений, использующих данные текстового файла для просмотра и сортировки по шаблону.
Разработка: Приложение "Сортировка списка" для просмотра и сортировки текстового списка по шаблону.
Состав выполняемых функций:
- Файловые операции: открыть, сохранить, закрыть
- Алгоритмы: преобразование вводимого текста в верхний регистр, до-бавление и сохранение записей в файле, удаление записей из загруженного списка, сортировка записей загруженного списка по шаблону
- Информационно-справочные: нет
Наращивание функциональности не предусматривается.
Защита данных предусматривается только от неквалифицированных действий пользователей.
В качестве входных данных используется текстовой файл Список.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;}
}
