Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Проектирование программного кода ⇐ ПредыдущаяСтр 4 из 4
Прежде всего, для обеспечения файлового ввода/вывода нужно подключить пространство имен System.IO, т.е. в начале файла с кодом программы написать: using System.IO;
Описание создаваемых обработчиков событий начнем с метода-обработчика пункта меню «Сохранить…». В этом случае необходимо: - отобразить на экране диалоговое окно выбора файла для сохранения; - если пользователем в этом окне нажата кнопка ОК, то получить имя файла для сохранения; - создать поток вывода и связать его с этим файлом; - создать объект класса BinaryWriter для обеспечения записи в двоичный файл и связать его с потоком; - координаты каждой точки массива points записать в файл с помощью метода Write(); - закрыть объект BinaryWriter и связанный с ним поток. Листинг обработчика приведен ниже: Privatevoid сохранитьToolStripMenuItem_Click(objectsender, EventArgse) { //отобразить диалоговое окно "Сохранить как..." if (saveFileDialog1.ShowDialog() == DialogResult.OK) { //получитьимяфайладлясохранения String FileName = saveFileDialog1.FileName; //создать (поток) новый файл с указанным именем FileStream myStream = new FileStream(FileName,FileMode.Create); //создать объект BinaryWriter и связать его с потоком BinaryWriter BW = new BinaryWriter(myStream); //просмотретьмассивточек Foreach (Pointpinpoints) { //записать координаты каждой точки в файл BW.Write(p.x); BW.Write(p.y); } BW.Close(); //закрыть BinaryWriter MyStream.Close(); //ипоток, связанныйсфайлом } } Метод-обработчик пункта меню «Открыть…» структурно похож на предыдущий за исключением использования компонента openFileDialog1 для получения имени открываемого файла и объекта класса BinaryReader для чтения данных из двоичного файла. Чтение данных из файла осуществляется с помощью метода ReadSingle(). Индикатором конца файла является равенство -1 результата вызова метода PeekChar(), который считывает один символ без удаления его из входного потока. Одновременно с чтением данные из файла добавляются в массив points и таблицу на форме: Private void открытьToolStripMenuItem_Click(object sender, EventArgs e) { //отобразитьдиалоговоеокно "Открыть..." if (openFileDialog1.ShowDialog() == DialogResult.OK) { //получитьимяоткрываемогофайла String FileName = openFileDialog1.FileName; //открыть поток (файл с указанным именем) FileStream myStream = new FileStream(FileName, FileMode.Open); //создать объект BinaryReader и связать его с потоком BinaryReader BR = new BinaryReader(myStream); Points.Clear(); //очистить массив точек dataGridView1.Rows.Clear(); //и таблицу на форме //пока не дощли до конца файла while (BR.PeekChar() != -1) { //считать координаты очередной точки float x = BR.ReadSingle(); float y = BR.ReadSingle(); //создать точку с этими координатами Point p = new Point(x, y); //добавить точку в массив points.Add(p); //и в таблицу на форме dataGridView1.Rows.Add(p.x, p.y); } BR.Close(); //закрыть BinaryReader myStream.Close(); //и поток, связанный с файлом } } Принцип сохранения массива-результата в текстовом формате аналогичен сохранению в двоичном формате, только в данном случае вместо класса BinaryWriter используется класс StreamWriter. Для записи в файл здесь удобно использовать метод WriteLine(), чтобы координаты одной точки занимали отдельную строку. Листинг обработчика приведен ниже: Privatevoid сохранитьРезультатToolStripMenuItem_Click(objectsender, EventArgse) { //отобразить диалоговое окно "Сохранить как..." if (saveFileDialog1.ShowDialog() == DialogResult.OK) { //получитьимяфайладлясохранения String FileName = saveFileDialog1.FileName; //создать поток (новый файл с указанным именем) FileStream myStream = new FileStream(FileName, FileMode.Create); //создать объект StreamWriter и связать его с потоком StreamWriter SW = new StreamWriter(myStream); //записатькоординатыточеквфайл foreach (Point p in res) SW.WriteLine(p.x+" "+p.y); SW.Close(); //закрыть StreamWriter MyStream.Close(); //ипоток, связанныйсфайлом } } Чтобы обеспечить сериализацию и десериализацию объектов классов, нужно подключить соответствующие пространства имен:
using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization;
Для реализации процессов сериализации и десериализации объектов класса Point необходимо присвоить этому классу атрибут [Serializable]: [Serializable] ClassPoint : IComparable { ... } Оба процесса реализуются через объекты класса BinaryFormatter и их методы Serialize() и Deserialize(): Private void сериализацияToolStripMenuItem_Click(object sender, EventArgs e) { //отобразить диалоговое окно "Сохранить как..." if (saveFileDialog1.ShowDialog() == DialogResult.OK) { //получитьимяфайладлясохранения String FileName = saveFileDialog1.FileName; //создать поток (новый файл с указанным именем) FileStream myStream = new FileStream(FileName, FileMode.Create); //создатьобъект BinaryFormatter длясериализации BinaryFormatter myFormatter = new BinaryFormatter(); //произвестисериализацию (сохранениеобъектавфайл) myFormatter.Serialize(myStream, points); //закрыть поток, связанный с файлом myStream.Close(); } } Private void десериализацияToolStripMenuItem_Click(object sender, EventArgs e) { //отобразитьдиалоговоеокно "Открыть..." if (openFileDialog1.ShowDialog() == DialogResult.OK) { try { //получитьимяоткрываемогофайла String FileName = openFileDialog1.FileName; //открыть поток (файл с указанным именем) FileStream myStream = new FileStream(FileName, FileMode.Open); //создать объект BinaryFormatter для десериализации BinaryFormatter myFormatter = new BinaryFormatter(); //очиститьмассивточек points.Clear(); //и таблицу на форме dataGridView1.Rows.Clear(); //выполнить десериализацию (восстановлениеизфайла) points = (ArrayList)myFormatter.Deserialize(myStream); //отобразить восстановленный массив на форме Foreach (Pointpinpoints) dataGridView1.Rows.Add(p.x, p.y); //закрыть поток, связанный с файлом myStream.Close(); } catch (SerializationException) { MessageBox.Show("Неверныйформатфайла!!!"); } } } Задание для самостоятельной работы Добавить в программу предыдущей лабораторной работы возможность сохранения данных в файл и чтения из файла. Исходную коллекцию данных необходимо сохранять в файл в двоичном виде, а также предусмотреть ее сериализацию. Коллекцию-результат сохранять в текстовый файл.
|
||
Последнее изменение этой страницы: 2018-06-01; просмотров: 166. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |