Потокове введення-виведення

У мові C++ дії, що пов’язані з операціями введення і виве­дення, виконуються за допомогою функцій бібліотек. Функції ведення і виведення бібліотек мови дозволяють читати дані з файлів та пристроїв і писати дані у файли і на пристрої.

Бібліотека мови C++ підтримує три рівня введення-виведення даних:

  • введення-виведення потоку;
  • введення-виведення нижнього рівня;
  • введення-виведення для консолі і порту.

При введенні-виведенні потоку всі дані розглядаються як потік окремих байтів. Для користувача потік — це файл на дис­ку або фізичний пристрій, наприклад, дисплей чи клавіатура, або пристрій для друку, з якого чи на який направляється потік даних. Операції введення-виведення для потоку дозволяють об­робляти дані різних розмірів і форматів від одиночного символу до великих структур даних. Програміст може використовувати функції бібліотеки, розробляти власні і включати їх у бібліоте­ку. Для доступу до бібліотеки цих класів треба включити в програму відповідні заголовні файли.

За замовчуванням стандартні введення і виведення повідомлень про помилки відносяться до консолі користувача (клавіатури та екрана). Це означає, що завжди, коли програма очікує введення зі стандартного потоку, дані повинні надходити з клавіатури, а якщо програма виводить дані — то на екран.

У мові C++ існує декілька бібліотек, які містять засоби введення-виведення, наприклад:stdio.h, iostream.h. Найчастіше застосовують потокове введення-виведення даних, операції яко­го включені до складу класів istream або iostream. Доступ до бібліотеки цих класів здійснюється за допомогою використання у програмі директиви компілятора #include <iostream.h>.

Для потокового введення даних вказується операція «>>» («читати з»). Це перевантажена операція, визначена для всіх простих типів і покажчика на char. Стандартним потоком введення є cin.

Формат запису операції введення має вигляд:

сin [>> values]; 

де values — змінна.

Так, для введення значень змінних х і у можна записати:

сin >> х >> у;

Кожна операція «>>» передбачає введення одного значення. При такому введенні даних необхідно дотримуватись конкретних вимог:

  • для послідовного введення декількох чисел їх слід розділяти символом пропуску (« ») або Enter (дані типу char роздiляти пропуском необов’язково);
  • якщо послідовно вводиться символ і число (або навпаки), пропуск треба записувати тільки в тому випадку, коли символ (типу char) є цифрою;
  • потік введення ігнорує пропуски;
  • для введення великої кількості даних одним оператором їх можна розташовувати в декількох рядках (використовуючи Enter);
  • операція введення з потоку припиняє свою роботу тоді, коли всі включені до нього змінні одержують значення. Наприклад, для операції введення х і у, що вказана вище, можна ввести значення х та у таким чином:

2.345   789
або   2.345
789.

Оскільки в цьому прикладі пропуск є роздільником між значеннями, що вводяться, то при введенні рядків, котрі мiстять пропуски у своєму складі, цей оператор не використовується. У такому випадку треба застосовувати функції getline(), get() тощо (див. розділ 7). У мові C++ бажано здійснювати потокові введення-виведення даних.

Для потокового виведення даних необхідна операція «<<» («записати в»), що використовується разом з ім’ям вихідного потоку cout. Наприклад, вираз

cout << х;

означає виведення значення змінної х (або запис у потік). Ця операція вибирає необхідну функцію перетворення даних у потік байтів.

Формат запису операції виведення представляється як:

cout << data [<< data1];,

де data, data1 — це змінні, константи, вирази тощо.

Потокова операція виведення може мати вигляд:
cout << “у =” << x + а – sin(x) << “\n“;.

Застосовуючи логічні операції, вирази треба брати в дужки:
cout << “р =” << (а && b || с) << “\n“;.

Символ переведення на наступний рядок записується як рядкова константа, тобто “\n”, інакше він розглядається не як символ керуючої послідовності, а як число 10 (код символу). Таких помилок можна уникнути шляхом присвоювання значення ке­руючих символів змінним, тобто:

#define << sp " "
#define << ht "\t"
#define << hl "\n".

Тепер операцію виведення можна здійснити так:
cout << “у =” << x + а – sin(x)<< hl; .

Слід пам’ятати, що при виведенні даних з використанням «cout <<» не виконується автоматичний перехід на наступ­ний рядок, для реалізації такого переходу застосовується так переведення рядка “\n” або операція endl. Тобто, вивести рядкову константу можна, наприклад, так:

cout << “О деле суди по исходу \n“; 

або   cout << “О деле суди по исходу” << endl;.

Приклад 4.1. Написати програму, що містить організацію виведення даних, пояснювальні повідомлення, а також символи переведен­ия рядка.

/* Р4_1.СРР — печать значений переменных с соответствующими пометками */
#include <iostream.h>
#include <conio.h>
int main()
{
char first = ’W’;
char middle = 'P';
char last = 'S'; 
int wozrast = 20; 
int doplata = 2;
float zarplata = 309.75; 
float prozent = 8.5;
//---------------- вывод результатов
cout << "Проверка исходных данных\n";
cout << first << middle << last << "\n\n";
cout << "Возраст доплата зарплата процент:\n";
cout << " " << wozrast << " " << doplata << " " << zarplata << " " << prozent;
getch ();
}

В останніх двох операціях виведеня програми можна використати символи табуляції. Наприклад, «\t» поміщає кожне наступне ім’я або число в наступну позицію табуляції (через вісім символів), у цьому випадку маємо:

cout << “Возраст \t доплата\t зарплата\t процент\t \n”;
cout << wozrast << “\t” << doplata << “\t” << zarplata << “\t” << prozent << “\n“;.

Для додаткового керування даними, що виводяться, використовують маніпулятори setw(w) та setprecision(d). Маніпулятор setw(w)призначений для зазначення довжини поля, що виділяється для виведення даних (w — кількість позицій). Маніпуля­тор setprecision(d) визначає кількість позицій у дробовій частині дійсних чисел.

Маніпулятори змінюють вигляд деяких змінних в об’єкті cout, що у потоці розташовані за ними. Ці маніпулятори нази­вають прапорцями стану. Коли об’єкт посилає дані на екран, він перевіряє прапорці, щоб довідатися, як виконати завдання, наприклад, запис:

cout << 456 << 789 << 123;

призводить до виведення значення у вигляді: 456789123, що ускладнює визначення групи значень.

Приклад 4.2. Написати програму, використовуючи маніпулятор setw().

// P4J2.CPP — использование манипулятора setw()
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
main ( )
{
cout << 456 << 789 << 123 << endl;
cout << setw(5) << 456 << setw(5) << 789 << setw(5) << 123 << endl;
cout << setw(7) << 456 << setw(7) << 789 << setw(7) << 123 << endl;
getch ();
}

Результати виконання програми:
456789123
    456     789     123
         456       789       123

У цьому прикладі з’явився новий заголовний файл iomanip.h, що дозволяє застосовувати функції маніпуляторів. При використанні функції setw() число вирівнюється вправо в межах заданої ширини поля виведення. Якщо ширина недостатня, то вказане значення ігнорується.

Функція setprecision(2) повідомляє про те, що число з пла­ваючою крапкою виводиться з двома знаками після крапки з округленням дробової частини, наприклад, при виконанні операції

cout << setw(7) << setprecision(2) << 123.456789;

буде отримано такий результат: 123.46.

Функції cout.width(w) та cout.precision(d), які потребують підключення тільки заголовного файла iostream.h, виконують дії, подібні тим, що і функції setw(w) та setprecision(d).

Операція введення використовує ті ж самі маніпулятори, що й операція виведення. Список змінних, в які будуть помі­щені дані, визначений у values.

Приклад 4.3. Написати програму обчислення податку на продаж.

// Р4_З.СРР — вычисление налога на продажи 
// использование манипулятора setprecision()
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
main ( )
{ float prod_sum; // prod_sumсумма продаж
float nalog;
//---------------  вывод подсказки для пользователя
cout << "Введите сумму продаж";
cin >> prod_sum;
//............... вычисление налога на продажу
nalog = prod_sum* 0.7;
cout << " " << setprecision(2) << prod_sum;
cout << " " << setprecision(2) << nalog << "\n";
getch(); // задержка экрана
return 0;
}

Унаслідок того, що у першому операторі cout відсутня інструкція переведення рядка, відповідь користувача на підказку (тобто введене значення змінної prod_sum) з’явиться відразу праворуч за самою підказкою.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *