//Вызов сортировки private void сортироватьToolStripMenuItem_Click(object sender, EventArgs e) { if (currFilename == "") { MessageBox.Show("Файл не выбран"); } else { //Если файл выбран float cost; string r = Interaction.InputBox("Введите максимальную стоимость конфет"); if (float.TryParse(r, out cost)) { //Очищаем поле от предыдущего резульата сортировки textBox2.Clear(); //Обновляем файл, который будем сортировать в соотвестии с textbox Sweets.PutToFile(textBox1, currFilename); //Создаем объект сортирощика Sorter s = new Sorter(5); //Сортировка resFileName = s.Sort(currFilename, cost); //Отображение результата Sweets.ReadAllFromFile(textBox2, resFileName); } } }
//Первый проход, из основоного файла распределяем тольео те объекты, которые подходят по условию void FirstMerge(string FileName, float max) { //Массив потоков для записи StreamWriter[] writers = new StreamWriter[CountOfFiles]; for (int i = 0; i < writers.Length; ++i) { writers[i] = new StreamWriter((i + 1).ToString(), false); } //индекс потока записи в который записываем int pos = 0; //Буфер Sweets buf = new Sweets(); //Чтение файла using (StreamReader reader = new StreamReader(FileName)) { //Пока считывание корректно, проверяем условие и, если совпало, //записываем в вспомогательный файл и переходим к след. файловому потоку while (Sweets.TryRead(buf, reader)) { if (buf.Cost < max) { buf.WriteStream(writers[pos]); pos = (pos + 1) % CountOfFiles; } } } //Закрываем потоки для записи for (int i = 0; i < writers.Length; ++i) { writers[i].Close(); } }
//Слияние int Merge() { //pos - индекс потока, в который записываем int pos = 0, p = 0; //Кол-во проходов до конца всех файлов int countofiterations = 0; //Открываем файловые потоки OpenFiles(); // do { //С каждого потока чтения берем по 1 объекту CurrSweets = new List <Sweets>(); for (int i = 0; i < FirstGroupOfStreams.Count; ++i) { CurrSweets.Add(FirstGroupOfStreams[i].GetNext()); } //Получаем индекс минимального p = Sweets.GetMin(CurrSweets); //Пока есть хотя бы 1 не null получаем индекс минимального while (p != -1) { //Записываем в поток чтения CurrSweets[p].WriteStream(SecondGroupOfStreams[pos]); //Ставим на место записанного след объект из этого файла CurrSweets.RemoveAt(p); CurrSweets.Insert(p, FirstGroupOfStreams[p].GetNext()); //Если файл окончен, закрываем файловый поток, удаляем его из списка и удаляем объект из списка if (CurrSweets[p] == null && FirstGroupOfStreams[p].IsEndOfFile) { CurrSweets.RemoveAt(p); FirstGroupOfStreams[p].Close(); FirstGroupOfStreams.RemoveAt(p); } //Берем следующий минимальный p = Sweets.GetMin(CurrSweets); } //Увеличиваем кол-во проходов ++countofiterations; //Переходим к следующему потоку записи для обработки след. серии pos = (pos + 1) % CountOfFiles; //Сбрасываем внутри аотоков для чтения считанные блоки Reset(); } while (!IsFilesFinished()); //Если Кол-во проходов ==1, сортировка завершена, сохраняем имя файла с финальной последовательностью if (countofiterations == 1) { finalFilename = finishFileNames[pos == 0 ? CountOfFiles - 1 : pos - 1]; } //Закрываем файлы CloseFiles(); return(countofiterations); }
public static void PutToFile(TextBox text, string FileName) { using (StreamWriter writer = new StreamWriter(FileName, false)) { string[] s = text.Text.Split(new String[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); Sweets buf; for (int i = 0; i < s.Length; ++i) { buf = new Sweets(s[i]); buf.WriteStream(writer); } } }
//Чтение\запись набора объектов в\из textbox public static void ReadAllFromFile(TextBox text, string FileName) { text.Clear(); using (StreamReader reader = new StreamReader(File.OpenRead(FileName))) { Sweets buf = new Sweets(); while (TryRead(buf, reader)) { text.Text += buf.ToString() + Environment.NewLine; } } }
private void открытьToolStripMenuItem1_Click(object sender, EventArgs e) { OpenFileDialog openFile = new OpenFileDialog(); openFile.Filter = "BIN файлы (*.bin)|*.bin"; if (openFile.ShowDialog() == DialogResult.OK) { //При открытии нового файла чистим все textbox и отображаем содержимое textBox1.Clear(); textBox2.Clear(); currFilename = openFile.FileName; Sweets.ReadAllFromFile(textBox1, currFilename); } }
private void сохранитьОтсортированыыйToolStripMenuItem_Click(object sender, EventArgs e) { if (currFilename == "") { MessageBox.Show("Нет файла для сохранения"); } else { SaveFileDialog saveFile = new SaveFileDialog(); saveFile.Filter = "BIN файлы (*.bin)|*.bin"; if (saveFile.ShowDialog() == DialogResult.OK) { Sweets.PutToFile(textBox2, saveFile.FileName); } } }
//Попытка получить следующий объект из потока, //если считана вся серия или дошли до конца файла - возвращаем null, иначе - считываем, //увеличиваем кол-во считанных блоков и возвращаем объект public Sweets GetNext() { Sweets res = null; if (!IsEndOfFile && !IsMaxRecordsRead) { res = new Sweets(); if (Sweets.TryRead(res, reader)) { ReadBlocks++; } else { res = null; } } return(res); }
//Попытка чтения из потока public static bool TryRead(Sweets sweets, StreamReader reader) { //Если конец потока - false if (!reader.EndOfStream) { //иначе читаем строку и стараемся получить информацию string st = reader.ReadLine(); if (!ParseString(st, sweets)) { return(false); } else { return(true); } } else { return(false); } }
//попытка распарсить строку static bool ParseString(string st, Sweets res) { //Для корректного четния должна поступить строка в формате //"<Наименование>, <Вес> кг, <Стоимость> руб, пр-во: <Производитель>, с <Дата> до <Дата>" //Делим по запятым, должно получится 5 разделов string[] vs = st.Split(','); if (vs.Length == 5) { //Исключения может возникнуть при преобразовании строки к числу try { res.Name = vs[0]; string buf = vs[1].Trim(); buf = buf.Remove(buf.Length - 2, 2).Trim(); res.Weight = float.Parse(buf); buf = vs[2].Trim(); buf = buf.Remove(buf.Length - 4, 4).Trim(); res.Cost = float.Parse(buf); res.Maker = vs[3].Trim().Remove(0, 7); buf = vs[4].Replace(" годен с ", " ").Replace(" до ", " ").Trim(); string[] dates = buf.Split(' '); res.MadeDate = DateTime.Parse(dates[0]); res.LastDay = DateTime.Parse(dates[1]); return(true); } //Если данные некорректны возвращаем false catch { return(false); } } else { return(false); } }
public Input(Sweets sweets) { InitializeComponent(); Sweets = sweets; }