- •О.С. Зеленський
- •Розділ 1. Загальні відомості створення додатку windows
- •1.1. Створення додатку Windows за допомогою майстра AppWizard
- •1.2. Варіанти майстрів для різних проектів
- •1.3. Короткий опис sdi програми
- •1.4. Короткий опис mdi програми
- •1.5. Короткий опис простого діалогового додатку
- •Контрольні питання
- •Розділ 2. Повідомлення і команди
- •2.1. Обробка повідомлень
- •2.2. Цикли обробки повідомлень
- •2.3. Карти повідомлень
- •Контрольні питання
- •Розділ 3. Документи та види
- •3.1. Клас додатку
- •3.2. Клас головного вікна
- •3.3. Клас документа
- •3.4. Класи виду
- •Контрольні питання
- •Розділ 4. Робота з клавіатурою, мишею і меню
- •4.1. Робота з клавіатурою
- •4.2. Робота з мишею
- •4.3. Робота з меню
- •Контрольні питання
- •Розділ 5. Виведення на екран
- •5.1. Класи графічних об'єктів
- •5.2. Робота зі шрифтами
- •5.3. Робота з пензликами та малювання графічних фігур
- •5.4. Робота з пензликом
- •5.5. Робота зі скролінгом
- •5.6. Приклад роботи з таблицями
- •5.7. Малювання на екрані маніпулятором "миша"
- •5.8. Завантаження та виведення на екран бітових зображень
- •5.9. Копіювання бітових образів
- •5.10. Малювання графічних об'єктів з використанням резинових контурів та метафайлів
- •5.11. Виділення графічних об'єктів у прямокутній області
- •5.12. Універсальний приклад роботи з двовимірною графікою з використанням резинового контуру
- •5.13. Запис на диск та зчитування з диску графічних об'єктів
- •5.14. Побудова кругових діаграм і гістограм
- •5.15. Користувацький режим роботи з графікою на прикладі малювання годинника Clock
- •Контрольні питання
- •Завдання
- •Розділ 6. Друк і попередній перегляд документів
- •6.1. Вибір і налаштування параметрів друку
- •6.2. Створення контекста пристрою
- •6.3. Друк документів і бібліотека mfc
- •6.4. Масштабування
- •6.5. Друк багатосторінкового документа
- •Контрольні питання
- •Розділ 7. Робота з файлами
- •7.1. Приклад роботи з файлами на основі класів cFile, cStdioFile та потоку fstream
- •7.1.1. Робота з класом cFile
- •7.1.2. Робота з потоком fstream
- •Можливі режими доступу
- •7.1.3. Робота з класом cStdioFile
- •7.2. Серіалізація даних, клас cArchive
- •7.3. Використання реєстру в додатках
- •Контрольні питання
- •Завдання
- •Розділ 8. Діалогові вікна
- •8.1. Створення діалогового вікна та простіші елементи керування
- •8.2. Робота зі списками і комбінованими полями
- •8.3. Ускладнений приклад зі списками
- •8.4. Робота з повзунками
- •8.5. Виведення бітових матриць в діалозі та у вікні виду
- •8.6. Лінійний регулятор, лінійний індикатор, інкриментний регулятор
- •8.7. Стандартні діалоги вибору файлів, шрифтів та кольору
- •8.8. Взаємоз'вязок діалога, документа та виду при розробці додатку
- •8.8.1. Клас cDialDoc
- •8.8.2. Клас cDialView
- •8.8.3. Клас Cdlg
- •8.9. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
7.1.2. Робота з потоком fstream
Для здійснення операцій з файлами окрім класу CFile можливо використовувати потокові класи: ifstream, ofstream і fstream. Ці класи є похідними, відповідно, від класів istream, ostream і iostream. Класи файлових потоків успадковують всі функціональні можливості своїх батьків (перевантажені операції << і >> для вбудованих типів, функції і прапори форматування, маніпулятори та ін.) Для реалізації файлового введення-виведення потрібно включити в програму заголовний файл fstream.
Для відкриття використовується функція-член open() з одним з об’єктів файлових потоків. Для закриття файлів використовується функція-член close():
Формат:
fs_obj.open(file_name, access);
fs_obj. close();
fs_obj – об’єкт, призначений для роботи з файлом.
file_name – рядок (або вказівка на рядок); може бути зазначений весь маршрут.
access – є значенням з таблиці можливих режимів доступу (табл. 7.3) або комбінацію з використанням оператора АБО ( | )
Таблиця 7.3
Можливі режими доступу
Режим |
Опис |
Код |
ios::in |
Відкрити файл для читання |
1 |
ios::out |
Відкрити файл для запису |
2 |
ios::ate |
Відкрити файл і встановити вказівку на кінець |
4 |
ios::app |
Відкрити файл для додавання |
8 |
ios::trunc |
Видалити вміст файлу |
16 |
ios::nocreate |
Якщо немає файлу, повертає відмову |
32 |
ios::noreplace |
Якщо файл є, його відкриття тільки для додавання |
64 |
ios::binary |
Відкрити файл в двійковому режимі |
128 |
Файли бувають двох типів: текстовими та бінарними (binary).
Доступ до інформації у файлах довільний, тобто звертання до файлів може здійснюватись в будь-якому порядку.
Робота з бінарними файлами за допомогою потоку fstream
Наведемо приклад, аналогічний прикладу роботи з класом CFile, де на диск записується 100 структур типу st, а потім зчитується структура з номером 5. Робота з бінарними файлами за допомогою потоку fstream приведена у функції відгуку OnButton2. Зауважимо, що для запису та читання бінарних файлів використовуються відповідно функції write, read.
void CFileDlg::OnButton2()
{
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;
fstream fp;
CString vr;
fp.open("1.txt", ios::in |
ios::out | ios::trunc |ios::binary);
try
{
for(i = 0; i < kol_st;i++)
{
ob1.a = 65 + i;
fp.write( (char*) (&ob1), sizeof(ob1));
}
}
catch( ...)
{
fp.close();
return;
}
try
{
fp.seekg((n - 1)*sizeof(st),ios::beg);
fp.read( (char*)(&ob2), sizeof(ob2));
}
catch( ...)
{
fp.close();
return;
}
vr.Format(" a = %d b = %f mas = %s ",ob2.a,ob2.b,
ob2.mas);
MessageBox(vr);
fp.close();
}
Робота з текстовими файлами за допомогою потоку fstream
Для роботи з текстовими файлами у потоці fstream використовуються перевантажені оператори: “<<” – для запису інформації у файл, “>>” – для читання інформації з файлу. Наведемо функцію відгуку OnButton3 для роботи з текстовими файлами.
void CFileDlg::OnButton3()
{
fstream fp;
CString vr;
fp.open("1.txt", ios::in | ios::trunc |ios::out);
fp << "1234 4567 890\n";
fp << "4567\n";
fp.seekg(0L,ios::beg);
char mas[255];
CString vv="";
while (!fp.eof())
{
fp.getline(mas,255,10);
if(strlen(mas) == 0)break;
vv+=mas;
}
MessageBox(vv);
fp.close();
}
У даному фрагменті спочатку відбувається запис до файлу текстової інформації, а потім її зчитування. При роботі з текстовим файлом інформація зазвичай зчитується по рядках до тих пір, поки не буде досягнуто кінця файлу. Якщо кінець файлу досягнуто, функція eof() повертає значення 1, у протилежному випадку – 0. Зчитується рядок за допомогою функції getline, де вказується вказівка на масив типу char*, максимальна кількість зчитуємих символів та розділовий символ рядків. За умовчанням розділовий символ дорівнює символу ‘\n’ (10-й код).
Результат роботи фрагменту програми приведено на рис. 7.3.
Рис. 7.3. Результат роботи з текстовими файлами на основі потоку fstream