Лабораторная работа №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. Лабораторная работа №14 СОЗДАНИЕ ПРИЛОЖЕНИЙ ДЛЯ РАБОТЫ С ФАЙЛАМИ - student2.ru Скомпилировать проект и проверить, что вводимая строка может быть сохранена и восстановлена с помощью команд 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?

Наши рекомендации