Читайте также:
|
|
Подключите пространство имён System.IO.
Начнём с финальной части - реализуем алгоритм вывода данных из массива в файл. Создадим обработчик события FormClosed для окна Form1 и подключим его к событию. Алгоритм сохранения будет описан в этом обработчике. В пособии [5] описан конструктор объектов класса FileStream. Воспользуемся им для создания объекта-потока, который используем для записи в файл:
FileStream F;
F = new FileStream("Данные", FileMode.Create, FileAccess.Write);
Теперь создадим объект класса BinaryFormatter, который будем использовать как инструмент записи в поток:
BinaryFormatter P = new BinaryFormatter();
Объекты F (поток) и P (средство общения с потоком) будем использовать при работе с методом Serialize. Организуем цикл вывода объектов из массива:
int i;
for (i = 0; i < КоличЭлем; i++)
{ P.Serialize(F, МДр]); }
F.Close();
Запустите программу, наберите три набора данных, а потом завершите работу программы. Проверьте: после завершения в той папке, где хранится готовая программа (exe-файл) образовался файл с именем Данные. Однако, после запуска программы список госномеров пуст - алгоритм считывания еще не готов.
Алгоритм считывания опишем в отдельном методе с именем Считывание, а оператор вызова этого метода запишем в обработчике события Load. Алгоритм метода немного сложнее предыдущего. Файл может быть, а может и отсутствовать. Например, при первом запуске программы. Это придётся учесть при использовании конструктора потока. Из всех констант перечисления FileMode лучше всего подходит OpenOrCreate: в случае отсутствия файла будет создан пустой файл:
FileStream F = new FileStream("Данные", FileMode.
OpenOrCreate, FileAccess.Read);
Для общения с потоком создаём также объект P:
BinaryFormatter P = new BinaryFormatter();
Так как мы формируем массив данных на основе считываемого файла, то начальное значение счетчика элементов равно нулю:
КоличЭлем = 0;
Теперь надо организовать считывание. Файл содержит разные объекты, длина каждого - разная. Однако, у каждого из них есть своя позиция в файле: номер байта начала объекта (или, по другому, позиция объекта в потоке). Определить эту позицию можно свойством Position. Счёт позиций идёт с нуля (с нулевого байта файла). После считывания последнего объекта указатель позиции получит значение, равное длине файла. Этим и воспользуемся:
while (F.Position<F.Length)
{ МД[КоличЭлем] = (Авто) P.Deserialize(F); КоличЭлем++; }
Осталось закрыть поток и создать список госномеров:
F.Close(); СоздСписГос();
Запустите программу и проверьте работу.
Дата добавления: 2015-08-09; просмотров: 138 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Задание для самостоятельного выполнения | | | Постановка задачи |