Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual1.doc
Скачиваний:
8
Добавлен:
07.03.2016
Размер:
4.35 Mб
Скачать

Контрольні питання

1. Призначення функції SetMapMode.

2. Що таке контекст пристрою?

3. Призначення функції GetDeviceCaps.

4. Призначення функції SetMaxPage класу CPrintInfo.

5. Яким чином здійснити переведення пікселів у міліметри?

6. Що включається у додаток при встановленні опції Printing and print preview у AppWizard?

7. Призначення функції OnPreparePrinting.

8. Призначення функції OnPrint.

9. Розкрийте відмінності режимів графічного відображення у пікселях (MM_TEXT) та у 0,01 дюйма (MM_LOENGLISH).

10. Яким чином організовується друк багатосторінкового документу?

11. Опишіть розрахунок кількості сторінок kol_st для розглянутого прикладу з виведенням прямокутників.

12. Розкрийте сутність алгоритму виведення прямокутників на декількох сторінках документу.

Розділ 7. Робота з файлами

7.1. Приклад роботи з файлами на основі класів cFile, cStdioFile та потоку fstream

Приклад роботи з файлами знаходиться у папці DISK\File\File1.

Дана програма призначена для виконання стандартних операцій роботи з файлами.

Проект формується з використанням режиму діалогу, Dialog Based. Найменування додатку File.

На рис. 7.1 наведемо діалог для роботи з файлами.

Рис.7.1. Діалог для роботи з файлами

У цьому діалозі розміщено 4 кнопки, кожна з яких відповідає за роботу з файлами:

  1. CFile – робота з класом CFile.

  2. fstream1 – робота з потоком fstream (бінарний режим).

  3. fstream2 – робота з потоком fstream (текстовий режим).

  4. CStdioFile – робота з класом CStdioFile.

Розглянемо кожну з них більш детально.

7.1.1. Робота з класом cFile

Клас CFile – це базовий клас бібліотеки MFC для роботи з файлами. Він працює з файлами у двійковому режимі. Похідний від нього клас CStdioFile підтримує роботу з текстовими файлами. Крім того, клас CFile використовується спільно з класом CArchive для зберігання об’єктів класів з бібліотеки MFC.

Приведемо методи для роботи з класом CFile, а також список констант, які визначають режим відкриття файлу.

Методи класу CFile перераховані в табл. 7.1.

Таблиця 7.1

Методи класу CFile

Метод

Призначення

Abort

Закриває файл, ігноруючи будь-які попередження і помилки

CFile

Конструює об'єкт класу CFile по заданому шляху або файловому логічному номеру

Close

Закриває файл і видаляє об'єкт

Flush

Виконує відкладений запис всіх даних

GetFileName

Отримує ім'я заданого файлу

GetLength

Отримує довжину файлу

GetPosition

Отримує поточну позицію файлового курсору

GetStatus

Отримує відомості про статус заданого файлу

LockRange

Блокує діапазон байтів у файлі

Open

Робить безпечне відкриття файлу з можливістю перевірки помилок

Read

Читає дані з файлу з поточної позиції

ReadHuge

Читає з файлу більше 64К даних, починаючи з поточної позиції. У 32-розрядному програмуванні не відрізняється від Read()

Remove

Видаляє заданий файл

Rename

Перейменовує заданий файл

Seek

Переміщує файловий курсор у задану позицію

SeekToBegin

Переміщує файловий курсор на початок файлу

SeekToEnd

Переміщує файловий курсор на кінець файлу

SetFilePath

Встановлює повний шлях до файлу

SetLength

Змінює довжину файлу

SetStatus

Встановлює статус файлу

UnLockRange

Знімає блокування з діапазону байтів у файлі

Write

Записує дані у файл з поточної позиції

WriteHuge

Записує у файл більше 64К даних, починаючи з поточної позиції. У 32-розрядному програмуванні не відрізняється від Write()

Список констант, які визначають режим відкриття файлу в конструкторі CFile, наведено в табл. 7.2.

Таблиця 7.2

Режими відкриття файлів в класі CFile

Константа

Призначення

CFile::modeCreate

Створює новий файл

CFile::modeNoInherit

Забороняє спадкування файлу дочірніми процесами

CFile::modeTruncate

Комбінується з modeCreate – якщо створюваний файл вже існує, він не обрізається до нульової довжини

CFile::modeRead

Відкриває файл тільки для читання

CFile::modeReadWrite

Відкриває файл для читання / запису

CFile::modeWrite

Відкриває файл тільки для запису

Продовження таблиці 7.2

Константа

Призначення

CFile::shareCompat

Відсутній в 32-розрядній MFC. При використанні в CFile::Open відповідає CFile:: shareExclusive

CFile::shareDenyNone

Відкриває файл, не забороняючи іншим процесам читання / запис

CFile::shareDenyRead

Відкриває файл, забороняючи іншим процесам читання з нього

CFile::shareDenyWrite

Відкриває файл, забороняючи іншим процесам запис до нього

CFile::shareExclusive

Відкриває файл у монопольному режимі, забороняючи іншим процесам читання / запис

CFile::typeBinary

Встановлює двійковий режим

CFile::typeText

Встановлює текстовий режим із спеціальною обробкою пар символів кінця / переведення рядка

В нашому прикладі для роботи з файлами (запис та читання з диску) використовується структура st, яка складається із змінної типу int, змінної типу double, та масиву з 10 символів char.

struct st

{

int a;

double b;

char mas[10];

};

Структура проініціалізована наступним чином:

// ------------------------

st ob1;

ob1.a = 65;

ob1.b = 1.5;

strcpy(ob1.mas, "123456789");

// --------------------------

Приведемо відгук OnButton1 на кнопку, яка відповідає за роботу з класом CFile.

// Робота з класом CFile

void CFileDlg::OnButton1()

{

int i;

int n = 5; // для вивода

int kol_st = 100;

// ------------------------

st ob1;

ob1.a = 65;

ob1.b = 1.5;

strcpy(ob1.mas, "123456789");

// --------------------------

st ob2;

char mas[255];

CFileException er;

CFile fp;

CString vr;

if(!fp.Open("1.txt", CFile::modeCreate |

CFile::modeReadWrite |

CFile::typeBinary,&er))

{

er.GetErrorMessage(mas,255);

MessageBox(mas);

return;

}

try

{

for(i = 0; i < kol_st;i++)

{

ob1.a = 65 + i;

fp.Write(&ob1, sizeof(ob1));

}

}

catch( CFileException* e )

{

e->GetErrorMessage(mas,255);

MessageBox(mas);

fp.Close();

return;

}

try

{

fp.Seek((n - 1)*sizeof(st),CFile::begin);

fp.Read(&ob2, sizeof(ob2));

}

catch( CFileException* e )

{

e->GetErrorMessage(mas,255);

AfxMessageBox(mas);

fp.Close();

return;

}

vr.Format(" a = %d b = %f mas = %s ",ob2.a,ob2.b,

ob2.mas);

MessageBox(vr);

fp.Close();

}

У даному фрагменті програми для обробки виключень використовується клас CFileException.

Спочатку ми відкриваємо файл «1.txt» для читання та запису. Якщо файлу на диску не буде – він буде створений. Також до конструктору передається адреса класу обробки виключень CFileException для того щоб у випадку виникнення помилки відобразити її на екрані дисплею. При виникненні помилки відкриття файлу функція Open поверне значення false.

Далі у блоці try … catch() відбувається запис 100 структур на диск, використовуючи функцію Write. Значення параметру a структури накопичується, починаючи з початкового значення, яке дорівнює 65.

На наступному етапі ми переходимо на структуру з номером n (n дорівнює 5) з метою її зчитування. Для цього треба скористатися функцією Seek, щоб перейти на задану позицію, після чого зчитати дані, використовуючи функцію Read. Це представлено у наступному фрагменті.

fp.Seek((n - 1)*sizeof(st),CFile::begin);

fp.Read(&ob2, sizeof(ob2));

Після цього на екрані дисплею роздрукуємо значення 5-ї структури (рис. 7.2.)

Рис. 7.2. Результат роботи з файлами на основі класу CFile

Слід зазначити, що розмір структури залежить від її упаковки – вирівнювання в пам'яті даних для оптимізації роботи компілятора. За упаковку структури відповідає директива препроцесора # pragma pack (n), де n – кількість байт для упаковки. За умовчанням структура упаковується кратно 8 байтам. Для того, щоб розмір структури в байтах відповідав дійсності, потрібно здійснити побайтову упаковку:

# pragma pack (1).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]