Потокові класи
Потік - це абстрактне поняття, яке відноситься до будь-якого переносу даних від джерела до приймача. Потоки С++, на відміну від функцій вводу/виводу в стилі С, забезпечують надійну роботу як зі стандартними, так і з визначеними користувачем типами даних, а також одноманітний і зрозумілий систаксис.
Читання даних з потоку називається вийманням, вивід в потік – поміщенням або включенням. Потік визначається як послідовність байтів і не залежить від конкретного пристрою, з яким відбувається обмін (оперативна пам’ять, файл на диску, клавіатура або принтер). Обмін з потоком для збільшення швидкості передачі даних проводиться, як правило, через спеціальну область оперативної пам’яті – буфер. Фактична передача даних виконується при виводі після заповнення буферу, а при вводі – якщо буфер вичерпаний.
За напрямом обміну потоки можна розділити на вхідні (данні вводяться в пам’ять), вихідні (дані виводяться з пам’яті) і двонаправлені (які допускають як виймання, так і включення).
За виглядом пристроїв, з якими працює потік, можна розділити потоки на стандартні, файлові і рядкові.
Стандартні потоки призначені для передачі даних від клавіатури і на екран дисплея, файлові потоки - для обміну інформацією з файлами на зонішніх носіях даних (наприклад, на магнітному диску), а рядкові потоки – для роботи з масивами символів в оперативній пам’яті.
Для підтримки потоків бібліотека С++ містить ієрархію класів, побудовану на двох базових класах – 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;
}