- •2.1 Елементи концепції ооп .. 20
- •1.1 Коментарі.
- •1.2 Прототипи функцій.
- •1.3 Операція розширення області видимості.
- •1.4 Оголошення в операторах.
- •1.5 Перегрузка функцій.
- •1.6 Значення формальних параметрів по замовчуванню.
- •1.7 Посилання та вказівники.
- •1.8 Специфікатор inline
- •1.9 Операції new та delete .
- •1.10 Вказівник на void.
- •1.11 Зв’язування із збереженням типів
- •1.12 Про структури та об’єднання.
- •2.1 Елементи концепції ооп.
- •2.3 Опис протоколу класу.
- •2.4 Передача повідомлень об’єктам.
- •3 Функції-члени.
- •3.1 Функції-члени в межах та за межами формального опису класу.
- •3.2 Про вказівник this.
- •3.3 Перевантаження функцій-членів. Параметри по замовчуванню.
- •4. Конструктори та деструктори.
- •4.1 Поняття про конструктори.
- •4.2 Деструктори.
- •4.3 Досягнення високої ефективності. Конструктор копіювання.
- •5 Глобальні та локальні об’єкти.
- •6 Статична пам’ять та класи.
- •7. Наслідування
- •7.1 Синтаксична реалізація наслідування
- •7.2 Правила доступу до полів даних
- •7.3 Конструктори та деструктори в похідних класах
- •7.4 Використання заміщуючих функцій-членів.
- •7.5 Похідні класи та вказівники.
- •7.6 Ієрархія типів
- •7.7 Множинне наслідування
- •8 Вiртуальнi функцiї та класи
- •8.1 Віртуальні функції.
- •8.2 Чисті віртуальні функції. Абстрактні класи.
- •8.3 Віртуальні деструктори.
- •8.4 Посилання як засіб для реалізації поліморфізму
- •8.5 Технічна реалізація механізму віртуальних функцій.
- •8.6 Віртуальні базові класи
- •8.6.1 Ієрархії класів та наслідування
- •8.6.2 Віртуальні базові класи
- •8.6.3 Виклик конструкторів та віртуальні базові класи.
- •9 Друзі
- •9.1 Дружні класи.
- •9.2 Дружні функції.
- •10 Перевантаження операторiв.
- •10.1 Перевантаження операторів. Загальний підхід.
- •10.2 Перетворення типів.
- •10.3 Перевантаження деяких операторів.
- •10.3.1 Оператор індексування масиву.
- •10.3.2 Перевантаження оператора виклику функції.
- •10.3.3 Оператор доступу до члена класу.
- •10.3.4 Перевантаження операторів інкремента та декремента.
- •10.3.5 Перевантаження операторів управління пам’яттю (new,delete).
- •10.3.6 Перевантаження оператора присвоювання.
- •11.1 Функціональні шаблони
- •11.1.1 Визначення та використання шаблонів функцiй.
- •11.1.2 Перевантаження шаблонiв функцiї.
- •11.1.3 Cпецiалiзованi функцiї шаблона.
- •11.2 Шаблони класів.
- •11.2.1 Визначення шаблонів класу
- •11.2.2 Константи та типи як параметри шаблону
- •11.2.3 Використання шаблонних класів
- •11.2.4 Спецiалiзацiя шаблонiв класу.
- •11.3 Шаблони та конфiгурацiя компiлятора.
- •11.3.1 Шаблони Smart.
- •11.3.2 Шаблони Global I External.
- •12.2 Переадресація вводу-виводу
- •12.3 Розширення потоків для типів кориcтувача
- •12.4 Операції роботи з потоком як дружні
- •12.5 Форматований ввід-вивід
- •12.5.1 Ширина поля
- •12.5.2 Заповнюючий символ
- •12.5.3 Число цифр дійсних чисел
- •12.5.4 Прапорці форматування
- •12.5.5 Маніпулятори
- •12.6 Стан потоку
- •12.7 Файловий ввід-вивід
- •12.7.1 Конструктори файлових потокiв
- •12.7.2 Вiдкриття файлу
- •12.8 Неформатований ввід-вивід
- •12.9 Деякі функції вводу-виводу
- •12.10 Форматування в пам’яті
- •13 Управління виключеннями
- •13.1 Виключення та стек
- •13.2.1 Синтаксис основних конструкцій
- •13.2.1.1 Використання try та сatch
- •13.2.1.2 Використання throw
- •13.2.2 Тип виключення та конструктор копії
- •13.2.3 Пошук відповідного типу виключення
- •13.2.4 Використання terminate() та некеровані виключення
- •13.2.5 Робота з специфікаціями виключень
- •13.2.6 Робота з непередбаченими виключеннями
- •13.2.7 Робота з конструкторами та виключеннями
- •13.2.8 Динамічні об’єкти
- •13.2.9 Передача значень з конструктора та деструктора
- •13.2.10 Робота з ієрархіями виключень
- •13.2.11 Робота з специфічними класами виключень
- •13.3 Структурне управління виключеннями
- •13.3.1 Використання кадрованого управління виключеннями
- •13.3.1.1 Синтаксис
- •13.3.1.2 Про функцію RaiseException()
- •13.3.1.3 Фільтруючий вираз
- •13.3.1.4 Перехоплення виключення процесора
- •13.3.2 Використання завершуючих обробників виключень
12.7 Файловий ввід-вивід
Бiблiотека С++ має три спецiалiзованих класи для файлового вводу/виводу:
ifstream: для операцiй з вхiдним дисковим фацлом.
ofstream: для олерацiй з вихiдним дисковим файлом.
fstream: для вхiдних i вихiдних операцiй з файлом.
Вказанi класи є похiдними вiд класів вiдповiдно istream,ostream,iostream (див. мал. 1). Тому вони унаслiдують всi їх особливостi (манiпулятори, прапорцi, перевантаженi оператори).
12.7.1 Конструктори файлових потокiв
Для кожного з перерахованих вище класiв передбачено 4 конструктори. Вони дозволяють робити слiдуюче:
-
Конструювати об'єкт, не вiдкриваючи файлу:
ifstream();
ofstream();
fstream;
-
Конструювати об'єкт, вiдкрити файл i прикрiпити об'єкт до файлу:
ifstream(const char *name,
int omode=ios::in,
int prot=filebuf::openprot);
ofstream(const char *name,
int omode=ios::out,
int prot=filebuf::openprot);
fstream(const char *name,
int omode,
int prot=filebuf::openprot);
-
Зконструювати об'єкт i прикрiпити його до вже вiдкритого файлу. При цьому вказується дескриптор файлу:
ifstream(int f);
ofstream(int f);
fstream(int f);
-
Конструювати об'єкт, асоцiйований з вказаним буфером; прикрiпити його до вже вiдкритого файлу, вказується дескриптор файла:
ifstream(int f, char *b, int len);
ofstream(int f, char *b, int len);
fstream (int f, char *b, int len);
12.7.2 Вiдкриття файлу
Для вiдкриття файлу в С++ можна використовувати конструктори ifstream, ofstream, fstream:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<ctype.h>
int main(void)
{
char fname[MAX];
cout<<“введіть ім’я вхідного файла”;
cin >>fname;
//відкрити вхідний файл
ifstream ifs (fname);
if (!ifs) {
cout <<"вiдкрити не можна";
return 0;}
cout<<“введіть ім’я вихідного файла”;
cin >>fname;
ofstream ofs (fname);
if(!ofs) {
cout <<"вiдкрити не можна";
return 0;}
char c;
while (ifs && ofs)
{ifs.get(c);
c=toupper(c);
ofs.put(c);}
//завдання виконане
cout<<endl<<“Вихідний файл є копією вхідного у верхньому”
<<”регістрі”<<endl;
return 0;
}
Файл також може бути вiдкритий за допомогою метода open потоку
fstream:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
int main(void)
{//невідкритий об’єкт-потік
fstream fin;
cout<<“введіть iм'я файлу”;
char fname [MAX];
cin >>fname;
fin.open (fname, ios::in);
if (fin) {cout <<"файл вiдкритий успiшно";
fin.close();}
else cout<<"неможливо відкрити файл"<<endl;
return 0;
}
Режим доступу конструюється наступним чином:
enum open.mode{
in=0x01,
out=0x02,
ate=0x04,
app=0x08,
trunc=0x10,
nocreate=0x20,
noreplase=0x40,
binaru=0x80 };
in - для читання;
out - для запису;
ate - вiдкриває та встановлює вказiвник на eof;
app - для дописування в кiнець файлу;
trunc - перезаписує файл, якщо такий файл iснує (якщо нi - створює);
nocrteate - вiдкриває файл, якщо вiн тiльки не iснує;
noreplase - вiдкриває файл, якщо вiн вже iснує;
binary - двiйковий файл.,
Приклад (ілюстрація режимів доступу):
int main(void)
{ //створюється новий файл,якщо тільки він не існує
ofstream ofs (fname,ios::out|ios::noreplase);
//перевірка стану потоку:
if(!ofs)
{cout<<“помилка! Файл”<<fname<<“вже існує”<<endl;
return 0;}
else{
//запис рядка в новий файл
ofs<<“Привіт! Я - новий файл”;
//файл закривається
ofs.close();
// Визначити новий об’єкт
fstream fs;
//відкрити файл та встановити на EOF
ofs.open(fname,ios::out|ios::ate);
fs<<"до якого дописано";
fs.close();
//Знову відкривається як вхідний
fstream ifs (fname);
if(ifs)
{
cout<<“і старий файл сказав:”<<endl;
//вислів старого файла
char line [MAX];
ifs.getline (line,sizeof(line));
cout <<line;
}
else{
cout<<“помилка при повторному відкритті”<<fname<<endl;
}}
return 0;
}
Буферизацією потоку можна керувати за допомогою метода setbuf. Ця функція асоцiює з потоком вказаний буфер:
void setbuf (char*p,int len);
p - адреса,
len - довжина буфера.
В класах файлових потоків існує метод close, який
а) опорожняє потік
б) Закриває закріплений за потоком файл
Якщо при спробі закрити файл відбувається помилка, встановлюється прапорець failbit стану потоку. Деструктр файлового об’єкта (чи його базового класу) повинен автоматично закривати файл.