русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Використання потоків


Дата додавання: 2014-11-28; переглядів: 1027.


 

Потоком називають спеціально сконструйований об'єкт, що включає крім даних певний набір функцій, що забезпечує виконання операцій введення/виведення (у тому числі й файлове введення/виведення). Потік може бути асоційовано з деяким пристроєм введення/виведення, з файлом, з певною областю оперативної пам’яті.

Основні операції з потоками мають назву "вставка" й "добування". Вставкою називають запис інформаційної одиниці у потік. Добування – читання чергової інформаційної одиниці з її вилученням із потоку. Для роботи з потоками використовуються бібліотечні файли iostream.h та fstream.h, в яких визначена система спеціальних (потокових) класів і об'єктів цих класів - потоків.

Об'єкти-потоки, які призначені для програмування операцій зі стандартними пристроями, називають стандартними потоками. Стандартні потоки є об'єктами класу iostream. Нижче наведені імена стандартних потоків та їх призначення.

cin - стандартний пристрій введення (по умовчанню це клавіатура, відповідає імені stdin у бібліотеці функцій введення/виведення мови С);

cout - стандартний пристрій виведення (по умовчанню це екран, відповідає імені stdout у бібліотеці С);

cerr - стандартний пристрій для виведення повідомлень про помилки й виняткові ситуації, при кожній новій вставці буфер, створюваний для цього пристрою, очищується;

clog - пристрій такого ж призначення, як і cerr, однак буфер не очищується, накопичуючи всі повідомлення, які поступають у потік clog.

 

Виведення у потік

Для виведення в потік (вставки в потік) використовується перевантажена операція із символом "<<". Перевантаження операції означає, що при виконанні зазначеної операції викликається відповідна функція. Операція з символом "<<" виконує вставку у відповідний потік (наприклад, у стандартний потік cout). Перевантажена операція "<<" у цьому випадку є альтернативою функції виведення типу printf. Нижче наведений рядок програми, що виводить на екран повідомлення "Hello, World!" та переводить курсор у початок наступного рядка.

cout << "Hello, World! \n";

У якості правого операнда операції "<<" можна використовувати вирази наступних типів: char , char*, int , long, float , double , long double, void*. Крім того, можна виводити значення будь-якого класового типу, для якого операція "<<" перевантажена (наприклад для рядкового типу string).

Операція "<<" повертає посилання на лівий операнд, вона має асоціативність "зліва направо". Це дає змогу записувати ланцюжок операцій виведення:

cout << "i=" << i << ", d=" << d << "\n" ;

Введення з потоку

Введення інформації з потоку (добування з потоку) здійснюється перевантаженою операцією ">>". Цю операцію можна використовувати замість функції scanf. Нижче наведений приклад оператора, що вводить значення змінної x із клавіатури.

cin >> x;

Правий операнд може бути змінною будь-якого припустимого типу. Допускаються ті ж самі типи, як і для операції вставки. Значенням, що повертається, для операції добування ">>" є посилання на лівий операнд. Також, як і операція вставки, операція добування має асоціативність ліворуч. При виконанні оператора

cin >> i >> d;

з потоку cin добувається перше значення, що привласнюється змінній i, а потім добувається наступне значення для змінної d.

Якщо введення значення завершується невдало (наприклад, через невідповідність типу змінної та значення, що вводиться), операція повертає значення null. Це дає можливість записувати оператори виду:

int x;

while (cin >> x) { ... }

Робота такого оператора циклу завершується при введенні неправильного значення (наприклад послідовності символів, які не відповідають цілому числу).

 

Форматні перетворення

При виконанні операцій введення/виведення за допомогою потоків форматні перетворення виконуються автоматично. Застосовуються формати, які відповідають прийнятому умовчанню. Виконуване перетворення залежить від типу значення, що передається, і від встановлених прапорів стану форматування. Ці прапори - статичні елементи класу ios. Приклади деяких прапорів форматування:

ios::hex - виведення в 16-ричному форматі;

ios::uppercase - при виведенні 16-ричних чисел літери A-F виводити у верхньому регістрі;

ios::showbase - перед 16-ричним числом вставляються символи "0x";

ios::scientific - виведення дійсних чисел у науковій нотації, тобто в експонентній формі;

ios::left - вирівнювання по лівому краю.

Функція setf - член класу потоку, встановлює, а функція unsetf знімає прапор форматування. У наступному прикладі встановлюється виведення в 16-ричному форматі з використанням великих букв A-F :

cout.setf(ios::hex | ios::uppercase);

Форматними перетвореннями можна управляти також і за допомогою спеціальних функцій - маніпуляторів. Маніпулятор setw(n) встановлює ширину поля для виведення поточного значення. Наприклад, при виконанні наступного рядка значення змінної i буде виводитися в поле, шириною 4, а значення змінної j - у поле, шириною 6 позицій:

cout << setw(4) << i << setw(6) << j << endl;

При використанні маніпуляторів необхідно підключити файл iomanip.h. Нижче наведено список найбільше часто використовуваних маніпуляторів:

dec - виконувати десяткові перетворення;

hex - виконувати 16-ричне перетворення;

endl - вставка символу нового рядка й очищення потоку;

ends - вставка кінцевого нульового символу в рядок;

setprecision(n) - завдання точності для чисел із плаваючої крапкою;

setw(n) - завдання ширини поля введення/виведення.

Ширину поля виведення можна встановлювати також за допомогою функції потоку width(n). Наприклад, послідовність рядків

cout.width(4);

cout << i;

cout.width(6);

cout << j;

cout << "\n";

еквівалентна наведеному вище прикладу виведення значень змінних i,j.

В якості практичної вправи подивіться, як виконується наступна програма:

 

// Приклад 1

#include <iostream.h>


<== попередня лекція | наступна лекція ==>
Засоби бібліотеки С | Void main()


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн