Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Проектирование программного кода




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