Лабораторная работа №14 СОЗДАНИЕ ПРИЛОЖЕНИЙ ДЛЯ РАБОТЫ С ФАЙЛАМИ
Цель работы-приобретение практического навыка по применению методов сериализации для сохранения на дисках и восстановления как стандартных обьектов Visual C++,так и обьектов, созданных пользователем,а также по выполнению стандартных файловых операций с помощью класса CFile библиотеки MFC .
Написанные на Visual C++программы наделяются существенной файловой поддержкой как в командах меню, так и в исходных кодах. Например,созданные с помощью мастера App Wizard приложения, не основанные на диалоге, имеют встроенное меню File с командами Save As,Open и New.Встроенные файловые средства,называемые сериализацией данных, позволяют сохранять на диске и восстанавливать обьекты стандартных классов MFC и после должной подготовки процесса сериализации данных в методе Serialize () документа,пользователь может пользоваться файловыми командами меню File. Для обьектов нестандартных классов пользователь должен предусмотреть метод Serialize ( ) и необходимый код для этого метода, чтобы получить такие же возможности сохранения и восстановления, как и для стандартных классов MFC.
Когда в программе отсутствует обьект типа документ, на который можно возложить файловые операции, как например, в программе на базе диалоговых окон, приходится работать с классом MFC CFile.Он обладает возможностями, необходимыми при работе с файлами как для записи данных на диск, так и для их последующего учения.Эти возможности реализуются следующими методами:
Abort-закрывает файл, игнорируя любые предупреждения и ошибки;
CFile -конструирует обьект класса CFile по заданному пути или файловому логическому номеру;
Close-закрывает файл и удаляет обьект;
Flush-выполняет отложенную запись всех данных;
Get File Name-возвращает имя заданного файла;
Get File Path-возвращает полный файловый путь заданного файла;
Get File Title-возвращает короткое имя заданного файла;
Get Length-возвращает длину файла;
Get Position-возвращает текущую позицию файлового указателя;
Get Status-возвращает сведения о статусе заданного файла;
Get Status-возвращает сведения о статусе открытого файла;
Lock Range-блокирует диапазон байтов в файле;
Open-производит безопасное открытие файла с возможностью проверки ошибок;
Read-читает данные из файла,начиная с текущей позиции;
Read Huge-читает данные из файла длной более 64К;
Remove-удаляет заданный файл;
Rename-переименовывает заданный файл;
Seek-перемещает файловый указатель на заданную позицию;
Seek To Begin-перемещает файловый указатель в начало файла;
Seek To End-перемещает файловый указатель в конец файла;
Set File Path-задает полный путь файла;
Set Length-изменяет длину файла;
Set Status-задает статус файла;
Unlock Range-снимает блокировку с диапазона байтов в файле;
Write-записывает данные в файл с текущей позиции;
Write Huge-записывает в файл с текущей позиции данные длиной более 64К;
Мырзалиев Б. А.
При открытии файла конструкторе CFile можно в качестве второго параметра использовать следующие режимы, соединяя их операцией "\": mode Create-для создания нового файла;
mode No Inherit-для запрещения наследования файла дочерними процессами; mode No Truncate-для запрета укорачивания открываемого файла; mode Read-открываемый файл только для чтения; mode Read Write-открываемый файл для чтения-записи; mode Write-открываемый файл только для записи;
share Deny None-открываемый файл доступен другим процессам для чтения-записи; share Deny Read-открываемый файл доступен другим процессам для чтения; share Deny Write-открываемый файл доступен другим процессам для записи; share Exclusive-открываемый файл для монопольного режима;
type Binary-открываемый файл для двоичного режима;
type Text-открываемый файл для текстового режима со специальной обработкой пар символов конца и перевода строки.
Эти режимы надо указывать вместе с именем класса CFile, за которым должны следовать знаки "::",например, CFile::mode Create\CFile::mode Write.
Задание 1.
Создать однодокументное приложение с сериализацией обьекта класса CString, выполнив следующие действия:
1. С помощью мастера App Wizard построить остов приложения с однодокументным интерфейсом, задав имя проекта Write и выбрав для проекта подходящий рабочий каталог.
2. Добавить в класс CWrite Doc следующий атрибут:
CString и String Data;
3. В конструкторе документа включить строку для инициализации атрибута:
CWrite Doc:: CWrite Doc() { String Data=" "; }
4. С помощью Class Wizard связать сообщение WM_CHAR с методом On Char( ) и включить обработчик этого сообщения:
void CWriter View::On Char(VINT nChar,VINT nRepCnt,VINT nFlags); { CWriter Doc*pDoc=Get Document(); ASSERT_VALID(pDoc); pDoc-> String Data= nChar;
Invalidate ();//-для перерисовки окна с измененной строкой; С View:: On Char( nChar,nRepCnt,nFlags);
}
5. Включить обработчик для сообщения On Draw;
void CWriter View::On Draw(cDC*pDC) { CWriter Doc*pDoc=Get Document();
ASSERT_VALID(pDoc);
pDC-> Text Out(o,o,pDoc->String Data);
}
6. Произвести сериализацию обьекта String Data,модифицировав следующим образом Serialize():
void CWriter Doc:: Serialize( CArchive& ar)
{if (ar.IsStoring()) //-сохраняет (TRUE) или восстановление (FALSE); {ar « String Data;}//-вывод в архив;
else {ar >>String Data;}//-чтение из архив;
}
7. Чтобы сообщить приложению об изменении данных, включить в обработчик On Char вызов метода Set Modified Flag: Invalidate (); PDoc-> Set Modified Flag ();
8. Скомпилировать проект и проверить, что вводимая строка может быть сохранена и восстановлена с помощью команд Save As и Open.
9. Для правильной работы команды New включить оператор String Data=" " в метод CWriter Doc::On New Document().
10. Включить в проект несколько обьектов различных стандартных классов таким же образом, как обьект String Data, и в методе Serialize предусмотреть последовательное сохранение и восстановление включенных обьектов.
11. Скомпилировать модифицированный проект и убедиться в его работоспособности.
Задание 2.
Создать приложение с однодокументным интерфейсом, использующий нестандартный класс с сериализацией,выполнив следующие действия:
1. С помощью мастера App Wizard построить остов приложения с однодокументным интерфейсом, задав имя проекта Serializer и выбрав для проекта подходящий рабочий каталог.
2. Включить в проект два новых файла CData.h и CData..cpp.
3. С помощью мастера Class Wizard в файле CData.h создать новый класс,имеющий поле data класса CString и необходимые методы для обработки и сохранения поля:
сlass CData : public CObject { private: CString data; DECLARE_SERIAL (CData) ;//-макрос для сериализации;
public:
CData (){ data= CString(" ");}
void Add Text (CString text) {data+=text; }
void Draw Text (cDC*pDC ) {pDC->Text Out (o,o,data); }
void Clear Text () {data=" "; }
void Serialize (CArchive & archive );
};
4. В файле CData..cpp определить реализацию метода сериализации для нового класса:
include " stafx.h "
include "Serializer Doc.h "
void CData :: Serialize (CArchive & archive ) { CObject:: Serialize (archive );
if (archive.IsStoring ()) { archive <<data;
else { archive >>data; }
} IMPLEMENT_SERIAL(CData,CObject,o)
5. В файл Serializer Doc.h включить строку
# include "CData.h "
6. В класс СSerializer Doc файла Serializer Doc.h включить атрибут:
public:
CData Data Object;
7. В файле Serializer Doc.cpp определить метод:
BOOL CSerializer Doc :: On New Document ()
{if (!CDocument:: On New Document ()) return FALSE; Data Object.Crear Text (); Update AllViews (NULL); return TRUE;
}
8. В файле Serializer Doc.cpp модифицировать метод сериализации документа,включив в этот метод оператор:
Data Object. Serialize(ar);
9. В файле Serializer Doc.cpp модифицировать метод On Draw,включив строку:
pDoc-> Data Object.Draw Text (pDC);
10. В файле Serializer Doc.cpp включить определение метода On Char:
void CSerializer View:: On Char(VINT nChar,VINT nRepCnt, VINT nFlags) { CSerializer Doc*pDoc=Get Document ();
ASSERT VALID (pDoc); pDoc-> Data Object.Add Text (CString(nChar));
Invalidate (); CView : On Char(nChar,nRepCnt,nFlags);
}
11. Скомпилировать проект и проверить функциональные возможности приложения.
Оңалбек Қ. Қ.
Задание3.
Создать диалоговое приложение для работы с файлами,выполнив следующие действия:
Создать остов диалогового приложения с именем Filer.
На диалоговой панели приложения расположить два окна редактирования CEdit и две кнопки
управления CButton для сохранения файла и для его чтения,при этом назвав первое окно "Для ввода
данных",а второе-для "Чтения файла".
Скомпилировать проект и проверить функциональные приложения.
Контрольные вопросы
1. Что такое сериализация обьектов Visual C++?
2. Какие изменения и дополнения в остове однодокументного приложения необходимо произвести, чтобы
обеспечить сериализацию обьекта стандартного класса MFC?
3. Какие изменения и дополнения в остове однодокументного приложения необходимо произвести, чтобы
обеспечить сериализацию обьекта нестандартного класса Visual C++?
4. В каких случаях нельзя использовать сериализацию обьектов любых классов Visual C++?
5. Обьяснить назначение класса CFile библиотеки MFC и кратко описать атрибуты и методы ?
6. Обьяснить назначение конструктора CFile и его параметров?
7. Перечислите все режимы открытия обьектов класса CFile?
8. Что такое текстовый или двоичный файл?Какое различие между этими файлами?
9. Поддерживается ли параллельная обработка данных файловой системой Visual C++?
10. Каково назначение файлового указателя?Что он определяет и как он изменяется?
11. Что такое статус файла и как он изменяется?
12. Каково различие в операторах Read и Read Huge,Write и Write Huge?
13. Возможно ли в файлах сохранять обьекты классов MFC?