- •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.10 Форматування в пам’яті
Бібліотека потоків С++ передбачає операції ввода-вивода над даними в пам’яті (резидентними потоками), що реалізовані в класах istrstream та ostrstream. Клас istrstream забезпечує iнтерфейс для форматого читання з пам'ятi, ostrstream - запису в пам'ять, strstream підтримує обидва типи операцій.
Приклад:
char info[ ]="вiдмiнникiв 5";
"двiйочникiв 2";
istrstream stat(info);
char name[20];
int mark;
for(int i=0; i<2; i++)
{stat >>name;
stat >>mark;
cout <<"в ПМ 21"
<<name
<<mark
<<endl;
}
Клас ostrstream надає інтерфейс для форматованого виводу в пам’ять. В класі є конструктор по замовчуванню, який виділяє буфер та динамічно змінює його розмір під час виконання. Також є конструктор, який дозволяє задавати буфер та його розмір. Розглянемо приклад:
#include<strstream.h>
int main(void)
{
//створюється потік з динамічним буфером
ostrstream osstr_a;
char buffer[100];
//створюється потік з заданим буфером
ostrstream osstr_b(buffer, sizeof(buffer));
//...
return 0;
}
Крім конструкторів та деструктора ostrstream має такі методи:
char*ostrstream::str()- повертає вказівник на буфер ostrstream. Крім того, він “заморожує ” масив, робить динамічний буфер власністю користувача. Після виклику str() необхідно знищити буфер або передати його у власність потока ostrstream так:
oss.rdbuf()->freeze(0);
int ostrstream::pcount()-повертає кількість байт, записаних в буфер.
Розглянемо приклад:
#include<strstream.h>
int main(void)
{
ostrstream oss;
iny i=10;
char *str=“значення рівне”;
oss<<str<<i<<endl;
//вивести результат форматування
cout<<oss.str();
//повернути буфер для очистки у власність oss
oss.rdbuf()->freeze();
return 0;
}
Відмітимо, що при роботі з об’єктами ostrstream необхідно в явному вигляді добавити до потоку нуль-символ. В противному випадку метод str() поверне вказівник на рядок, не обмежений нуль-символом.
Можна створити потiк ostrstream в режимi доповнення, встановивши бiт в ios::ate або ios::app в опціональному третьому параметрі конструктора.Це дозволить передати в якості буфера обмежений нулем рядок і поміщення в буфер почнуться з позиціії нульового символа. Такий режим можна використати для конкатенації рядків. Приклад:
char msg[100]=“Час=”;
ostrstream oss(msg,sizeof(msg),ios::out|ios::app);
char time=“11:20:34”;
oss<<time;
cout<<oss.str();
oss.rdbuf()->freeze();
Контрольні запитання
1. Як організована система вводу-виводу С++?
2. Чому для перегрузки запису в потік та зчитування використані операції зсуву ?
3. Що забезпечує “зчіплений” виклик операторів вводу-виводу ?
4. Як здійснюється переадресація вводу-виводу для типів даних користувача ?
5. Як регулюється ширина поля потоку при форматованому виводі?
6. Для чого використовується precision()?
6. Як працювати з прапорцями форматування ?
7. Які функції та типи маніпуляторів?
8. Як аналізувати стан потоку та керувати ним ?
9. Які дії можуть виконувати конструктори файлових потоків?
10. Як відкрити файл в текстовому та бінарному режимі?
11. Які основні функції роботи з файлами ?
12. Чому можна порівнювати об’єкти з нулем ?
13. Для чого служить метод str() та freeze()?
14. Що буде у випадку, коли в потоці при виклиці str() немає нуль-символа?
15. Чи відрізняються кількості символів, прочитаних в текстовому та бінарному режимах в прикладі п. 17.8.3
Завдання 12:
1. Переадресовуючи стандартний ввід-вивід, написати програму копіювання вмісу деякого текстового файлу у інший файл.
2. Описати клас complex та перегрузити оператори виводу в потік та вводу, визначивши їх як
а) члени класу
б) дружні
3. Написати програму, в якій
а) відкривається файл та прикріплюється до об’єкта;
б) конструюється об’єкт та прикріплюється до вже відкритого файла;
в) відкривається файл за допомогою метода open().
Продемонструвати різні режими доступу
4. Описавши клас myfile, полем якого виступає змінна типу *FILE, визначити ряд власних функцій роботи з файлом (відкриття в текстовому та бінарному режимах, запису та зчитування інформації, закриття), використовуючи відповідні бібліотечні функції С++. Для відкриття файлу використовувати конструктори файлових потоків.
5. Дописати на початок деякого виконуваного файлу інший ехе-файл, який виконується замість вихідного.
6. Написати функцію, яка, відкриваючи файл, що є С++-програмою,
а) дописує в неї перегружену до однієї з функцій так, щоб вона викликалась замість вихідної (змінюється сигнатура);
б) знищує всі коментарі;
в) перевіряє відповідність відкриваючих та закриваючих дужок;
г) використовуючи набір певних директив define, кодує окремі
фрагменти програми (з підключенням відповідного файлу директив препроцессору щоб зберігалась правильність програми);
д) дописує на початок програми фрагмент коду, який видає певне повідомлення та перериває роботу програми на деякий час;
7. Вивести число
а) з заданою шириною поля
б) з заданою точністю
в) з заданим заповнюючим символом
г) з вказаною основою
д) з вказаною нотацією
е) з вирівнюванням по лівому(правому) краю поля
є) з вказанням знаку числа
Використати прапорці форматування та методи роботи з ними.
8. Виконати попередню вправу з використанням маніпуляторів.
9. Визначити екземпляр класу ostrstream з динамічним буфером. Записати в буфер різнотопні дані та вивести результат форматування за допомогою метода str(). Повернути буфер для очистки у власність об’єкта за допомогою метода freeze().
Перевірити, що знаходиться в буфері після виклику цього методу. Чи можна ще дописувати якісь дані в буфер після виклику freeze()?