У мові 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) з’явиться відразу праворуч за самою підказкою.