Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи по програмуванні(14 лаб).doc
Скачиваний:
77
Добавлен:
16.05.2015
Размер:
1.43 Mб
Скачать

Визначені об’єкти-потоки

Механізм потоків C++ грунтується на перевантаженні функцій (операцій), що забезпечує для кожного типу даних, які передаються, виклик відповідної функції. Застосування процедур обмежено файловими потоками та деякими пристроями, доступ до яких можливий як до визначених потоків. Ці процедури не допускають розширення. Класи C++, завдяки поліморфізму, дозволяють одним і тим же процедурам працювати з потоками різних типів. Широке використання перевантажених функцій дозволяє бібліотеці потоків підтримувати однаковий інтерфейс I/O. Такий інтерфейс робить код більш розбірливим та сприяє кращому абстрагуванню даних. Крім того, застосування у I/O - класах перевантажених операцій приводить до більш простого та зрозумілого синтаксису.

Щоб забезпечити програмі доступ до бібліотеки потоків C++, необхідно включити заголовочний файл iostream.h; також можуть знадобитися файли fstream.h (файловий ввод/вивід), iomaniph (файл маніпуляторів) та strstream.h (резвдентігі потоки).

Бібліотека iostream має чотири визначених об'єкта потока. Всі вони асоційовані зі стандартним інтерфейсом I/O. Ці об'єкти описані у таблиці 10.1 :

Таблиця 10.1 - Функції бібліотеки iostream

Ім’я

Клас

Опис

Сіn

Istream

Асоціюється зі стандартним введенням (клавіатурою)

Cout

Ostream

Асоціюється зі стандартним виведенням (екраном)

Cerr

Ostream

Асоціюється зі стандартним пристроєм помилок (екраном) з небуферизованим виводом

Clog

Ostream

Асоціюється зі стандартним пристоєм помилок (екраном) з буферізованим виводом

Операції поміщення та вилучення

Бібліотека класів C++ передбачає два основних класи для вводу та виводу: відповідно istream та ostream. Потокові оператори застосовуються наступним чином:

об'єкт_потоку_вводу » змінна; об’ект_потоку_виводу « змінна;

Примітка. Ці оператори не слід шугати з відомими побітовими операторами зсуву вліво та вправо. Образно кажучи, в розглядуваному контексті перевантажені оператори » та « однозначно ясно вказують напрямок потоку даних від одного об'єкта до іншого.

Поток cout (character out) - стандартний символьний вихідний шток, що по замовчування відповідає пристрою виведення (дисплей). Клас ostream використовує для виведення перевантажену операцію лівого зсуву («), Якщо ця операція застосовується об'єктом-потоком, вона носить ім'я операції поміщення у поток (insertion operation). Наступний приклад друкує рядок, застосовуючи операцію поміщення до визначеного об'єкту cout

#include<iostream.h>

int main(void)

{

cout «'Hello!';

return 0;

Проаналізуємо, як відпрацює такий фрагмент. По-перше, С++ визначить, що в даній операції « лівий аргумент cout має тип ostream, а правий ~ char*. За цими даними у заголовочному файлі буде знайдений відповідний прототип функції - ostream& operator«(ostream&, char*). Після цього буде згенерований виклик функції поміщення у поток operator« з рядком Hello!’ та екземпляром cout в якості параметрів. Іншими словами, здійснюватиметься виклик стандартної бібліотечної функції operator«(couit'Hello!'), як того у даному випадку вимагає прототип.

Аналогом в традиційному С потоку cout відповідає функція fprintf() та ім'я пристрою виведення stdout Розглянемо простий приклад, що застосовує у двох варіантах відповідно printf() (це тільки скорочена форма fprintf(stdout, ...j) та об'єкт cout:

1 варіант double num=2.35;

printf ("show I:%Id\а", ішш); // "сміття" па виході!

2 варіант double num~2.35;

cout«”show 2=”«num«”\n”; // а тут все буде правильно

Саме тут і впадає в очі перевага потоків. Символи % ld в першому варіанті повідомляють про те, що змінна num відноситься до типу long. У наступному рядку при активації функції виявляється невідповідність типів, і printf() мовчки виконує неправильне виведення. Застосовуючи у другому варіаші об'єкт - поток, подібна помилка просто виключена - інформація про тип автоматично надходить безпосередньо від самого об'єкту cout.

Поток cin(character in) - стандартний символьний поток введення, що по замовчування відповідає клавіатурі. Клас istream використовує для введення перевантажену операцію правого зсуву (>>). У розглядуваному контексті її називають операцією вилучення з потоку (extraction operation). Аналогом цього потоку в Сі відповідає fscanf() та ім'я пристрою stdin. Наступний приклад застосовує операцію вилучення зі стандартного потоку для визначеного об'єкту сіп, аби прочитати рядок з клавіатури:

#include<iostream.h> int main(void)

{

char name [100];

cout«”Введіть ваше ім'я;;

сіn » name;

cout «"Привіт,";

cout«name;

return 0;

Класи istream та ostream відповідно » та « для усіх вбудованих типів даних. Таке перевантаження дозволяє використовувати однаковий синтаксис для роботи зі змінними різних типів. Наступний приклад ілюструє тотожність синтаксису в такій ситуації:

#include <iostream,h>

int main (void) {

Char c=’A’;

signed char sc =‘B’;

unsigned char uc~C’;

int i = 0xd;

float f= 1.7;

double d = 2.8;

cout« c; // Викликає operator «(char)

cout«sc; //Викликає operator «(signed char)

cout«uc; //Викликає operator «(unsigned char)

cout«i; //Викликає operator «(int)

cout« f; // Викликає operator « (float)

cout« d; // Викликає operator « (double) return 0;}