Потокові класи
Потік - це абстрактне поняття, яке відноситься до
будь-якого переносу даних від джерела до приймача. Потоки С++, на відміну від
функцій вводу/виводу в стилі С, забезпечують надійну роботу як зі стандартними,
так і з визначеними користувачем типами даних, а також одноманітний і
зрозумілий систаксис.
Читання
даних з потоку називається вийманням,
вивід в потік – поміщенням або включенням. Потік визначається як
послідовність байтів і не залежить від конкретного пристрою, з яким
відбувається обмін (оперативна пам’ять, файл на диску, клавіатура або принтер).
Обмін з потоком для збільшення швидкості передачі даних проводиться, як
правило, через спеціальну область оперативної пам’яті – буфер. Фактична передача даних виконується при виводі після
заповнення буферу, а при вводі – якщо буфер вичерпаний.
За
напрямом обміну потоки можна розділити на вхідні
(данні вводяться в пам’ять), вихідні
(дані виводяться з пам’яті) і двонаправлені
(які допускають як виймання, так і включення).
За
виглядом пристроїв, з якими працює потік, можна розділити потоки на стандартні, файлові і рядкові.
Стандартні потоки призначені для передачі даних від клавіатури і на екран дисплея, файлові
потоки - для обміну інформацією
з файлами на зонішніх носіях даних (наприклад, на магнітному диску), а рядкові потоки – для роботи з масивами
символів в оперативній пам’яті.
Для
підтримки потоків бібліотека С++ містить ієрархію класів, побудовану на двох
базових класах – ios і streambuf. Клас ios містить загальні для вводу і виводу
поля і методи, клас streambuf забезпечує
буферизацію потоків і їх взаємодію з фізичними пристроями. Від цих класів
наслідується клас istream для
вхідних потоків і ostream – для вихідних. Два останніх класи є
базовими для класу iostream, що реалізує двонаправлені потоки. Нижче в ієрархії класів
розміщуються файлові і рядкові потоки. Далі перелічені часто використовувані
класи потоків.
ios - базовий
клас потоків;
istream - клас вхідніх потоків;
ostream - клас вихідних
потоків;
iostream - клас
двонапрямлених потоків;
istringstream - клас вхідних
рядкових потоків;
ostringstream - клас вихідних рядкових потоків;
stringstream
- клас двонапрямлених рядкових потоків;
ifstream
- клас вхідних файлових потоків;
ofstream
- клас вихідних файлових потоків;
fstream
- клас двонапрямлених файлових потоків.
Опис
класів знаходиться в заголовочних файлах:
<ios> - базавий клас потоків вводу/виводу;
<iosfwd> - попередні об’яви засобів вводу/виводу;
<istream> - шаблон потоку вводу;
<ostream> - шаблон потоку виводу;
<iostream> - стандартні
об’єкти і операції з потоками вводу/виводу;
<fstream> - потоки вводу/виводу в файли;
<sstream> -
потоки вводу/виводу в
рядки;
<strbuf> - буферизація потоків вводу/виводу;
<iomanip>
- маніпулятори.
Підключення
до програми файлів <fstream> і <sstream> автоматично підключає і файл <iostream>, так як він є для них базовим.
Основною
перевагою потоків порівняно з функціями вводу/виводу, наслідуваними з бібліотеки
С, є контроль типів, а також розширюваність, тобто є можливість працювати з
типами, визначеними користувачем. Для цього потрібно визначити операції
потоків.
Крім того,
потоки можуть працювати з розширеним набором символів wchar_t. Для цього використовуються класи wistream, wostream, wofstream і т. д. . До недоліків потоків можна
віднести зниження швидкодії програми, яке в залежності від реалізації
компілятора може бути досить відчутним.
Стандартні потоки
Заголовочний
файл <iostream> містить, крім опису класів для вводу/виводу, чотири
зумовлені об’єкти:
Об’єкт
|
Клас
|
Опис
|
cin
|
istream
|
Зв’язується з клавіатурою (стандартним буферизованим
вводом)
|
cout
|
ostream
|
Зв’язується з екраном (стандартним буферизованим
виводом)
|
cerr
|
ostream
|
Зв’язується з екраном (стандартним небуферизованим
виводом), куди направляються повідомлення про помилки
|
clog
|
ostream
|
Св’язується з екраном (стандартним буферизованим
виводом), куди направляються подомлення про помилки
|
Ці об’єкти створюються при включенні в
програму заголовочного файлу <iostream>, при цьому стають доступними
зв’язані з ним засоби вводу/виводу. Імена цих об’єктів можна перепризначити на
інші файли або символьні буфери.
В класах istream і ostream операції виймання з потоку >> і
поміщення в потік << визначені шляхом перегрузки операції зсуву.
Наприклад:
#include <iostream>
using namespace std;
int main()
{
int a;
cin>>a;
cout<<”Vi vveli ”<<a;
}
|