Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

19.4.2. Встановлення ширини поля, точності та символів заповнення

Окрім прапорців форматування можна також встановлювати ширину поля, символ заповнення і кількість цифр після десяткової крапки (точність). Для цього достатньо використовувати такі функції:

streamsize width(streamsize len);

char fill(char ch);

streamsize precision(streamsize num);

1. Функція width() повертає поточну ширину поля і встановлює нову, що дорівнює значенню параметра len. Ширина поля, яка встановлюється за замовчуванням, визначається кількістю символів, необхідних для зберігання даних у кожному конкретному випадку.

2. Функція fill() повертає поточний символ заповнення (за замовчуванням використовується пропуск) і встановлює як новий поточний символ заповнення значення, які задаються параметром ch. Цей символ використовують для доповнення результату символами, яких не вистачає для досягнення заданої ширини поля.

3. Функція precision() повертає поточну кількість цифр, що відображаються після десяткової крапки, і встановлює нове поточне значення точності, що дорівнює значенню параметра num2|. Тип streamsize визначено як цілочисельний тип.

Розглянемо програму, яка демонструє використання цих трьох функцій.

Код програми 19.5. Демонстрація механізму використання функцій встановлення ширини поля, точності та символів заповнення

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

cout.setf(ios::showpos); // Відображ. знаку "+" перед позит. знач.

cout.setf(ios::scientific); //Відображ. чисел в експоненц. вигляді

cout << 123 << " " << 123.23 << "\n";

cout.precision(2); // Дві цифри після десяткової крапки.

cout.width(10); // Все поле складається з 10 символів.

cout << 123 << " ";

cout.width(10); // Встановлення ширини поля в 10 символів.

cout << 123.23 << "\n";

cout.fill('#'); // Як заповнювач використаємо символ "#"

cout.width(10); // Встановлення ширини поля в 10 символів.

cout << 123 << " ";

cout.width(10) // Встановлення ширини поля в 10 символів.

cout << 123.23

getch(); return 0;

}

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

+123 +1.232300е+002

+123 +1.23е+002

######+123 +1.23е+002

У деяких реалізаціях С++-компілятора необхідно встановлювати значення ширини поля перед виконанням кожної операції виведення даних. Тому функція width() у попередній програмі викликалася декілька разів.

У C++-системі введення-виведення визначено і перевантажені версії функцій width(), precision() і fill(), які не змінюють поточні значення відповідних параметрів форматування і використовуються тільки для їх отримання. Ось як виглядають їх прототипи:

  • streamsize width() – повертає поточну ширину поля;

  • char fill() – повертає поточний символ заповнення;

  • streamsize precision() – повертає поточну кількість цифр, що відображаються після десяткової крапки

19.4.3. Використання маніпуляторів введення-виведення даних

Маніпулятори дають змогу вбудовувати настанови форматування у вираз введення-виве­дення даних.

У С++-системі введення-виведення передбачено і другий спосіб зміни параметрів форматування даних, пов'язаних з потоком. Він реалізується за допомогою спеціальних функцій – так званих маніпуляторів, які можна містити у вираз введення-виведення. Призначення та функції стандартних С++маніпуляторів введення-виведення описано в табл. 19.3.

Табл. 19.3. Стандартні С++-маніпулятори введення-виведення

Маніпулятор

Призначення

Функція

boolalpha

Встановлює прапорець boolalpha

Введення-виведення

dec

Встановлює прапорець dec

Введення-виведення

endl

Виводить символ нового рядка і "скидає" потік, тобто переписує вміст буфера, пов'язаного з потоком, на відповідний пристрій

Виведення

ends

Вставляє у потік нульовий символ (' \0')

Виведення

fixed

Встановлює прапорець fixed

Виведення

flush

"Скидає" потік

Виведення

hex

Встановлює прапорець hex

Введення-виведення

internal

Встановлює прапорець internal

Виведення

left

Встановлює прапорець left

Виведення

noboolalpha

Онулює прапорець boolalpha

Введення-виведення

noshowbase

Онулює прапорець showbase

Виведення

noshowpoint

Онулює прапорець showpoint

Виведення

noshowpos

Онулює прапорець showpos

Виведення

noskipws

Онулює прапорець skipws

Введення

nounitbuf

Онулює прапорець unitbuf

Виведення

nouppercase

Онулює прапорець uppercase

Виведення

oct

Встановлює прапорець oct

Введення-виведення

resetiosflags( fmtflags f)

Онулює прапорці, що задаються у параметрі f

Введення-виведення

right

Встановлює прапорець right

Виведення

scientific

Встановлює прапорець scientific

Виведення

setbase(int baseClass)

Встановлює основу системи числення, що дорівнює значенню baseClass

Виведення

setfill(int ch)

Встановлює символ-заповнювач, що дорівнює значенню параметра ch

Виведення

setiosflags( fmtflags f)

Встановлює прапорці, що задаються у параметрі f

Введення-виведення

setprecision( int p)

Встановлює кількість цифр точності (після десяткової крапки) , що дорівнює значенню параметра p

Виведення

setw(int w)

Встановлює ширину поля, що дорівнює значенню параметра w

Виведення

showbase

Встановлює прапорець showbase

Виведення

showpoint

Встановлює прапорець showpoint

Виведення

showpos

Встановлює прапорець showpos

Виведення

skipws

Встановлює прапорець skipws

Введення

unitbuf

Встановлює прапорець unitbuf

Виведення

uppercase

Встановлює прапорець uppercase

Виведення

ws

Пропускає провідні "пропускні" символи

Введення

У процесі використання маніпуляторів, які приймають аргументи, необхідно приєднати до програми заголовок <iomanip>.

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

Код програми 19.6. Демонстрація механізму використання маніпуляторів для керування процесом форматування даних, що виводяться

#include <iostream> // Для потокового введення-виведення

#include <iomanip>

using namespace std; // Використання стандартного простору імен

int main()

{

cout << setprecision(2) << 1000.243 << endl;

cout << setw(20) << "Всім привіт! ";

getch(); return 0;

}

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

1е+003

Всім привіт!

Зверніть увагу на те, як використовуються маніпулятори у послідовності операцій введення-виведення даних. Окрім того, зверніть увагу також на те, коли маніпулятор викликається без аргументів (як, наприклад, маніпулятор endl у наведеному вище коді програми), то його ім'я вказується без пари круглих дужок.

У наведеному нижче коді програми використовується маніпулятор setiosflags() для встановлення прапорців scientific і showpos.

Код програми 19.7. Демонстрація механізму використання маніпулятора setiosflags() для встановлення прапорців scientific і showpos

#include <iostream> // Для потокового введення-виведення

#include <iomanip>

using namespace std; // Використання стандартного простору імен

int main()

{

// Відображення знаку "+" перед позитивним значенням числа

cout << setiosflags(ios::showpos);

// Відображення чисел в експоненціальному вигляді

cout << setiosflags(ios::scientific);

cout << 123 << " " << 123.23;

getch(); return 0;

}

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

+123 +1.232300е+002

А у цій програмі продемонстровано механізм використання маніпулятора ws, який пропускає провідні "пропускні" символи під час введення рядка в масив sMas.

Код програми 19.8. Демонстрація механізму використання маніпулятора ws, який пропускає провідні "пропускні" символи

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

char sMas[80];

cin >> ws >> sMas;

cout << sMas;

getch(); return 0;

}