68936

Форматування за допомогою членів класу ios

Лекция

Информатика, кибернетика и программирование

Зокрема можна самостійно задавати різні прапори форматування визначені усередині класу ios або викликати різноманітні функціїчлени. Розглянемо спочатку засоби форматованого введеннявиводу за допомогою прапорів і функцій членів класу ios.

Украинкский

2014-09-27

105 KB

0 чел.

Лекція № 28

Тема: Форматування за допомогою членів класу ios

План

  1.  Форматування за допомогою членів класу ios
  2.  Функції для роботи з прапорцями формату
  3.  Застосування маніпуляторів формату

Мова С++ дозволяє виконувати операції форматованого введення-виводу. Наприклад, можна задати ширину поля, вказати основу числення або визначити кількість цифр після десяткової крапки. Для форматування даних можна застосовувати два схожих, але разных способу. По-перше, можна прямо звернутися до членів класу ios. Зокрема, можна самостійно задавати різні прапори форматування, визначені усередині класу ios, або викликати різноманітні функції-члени. По-друге, у виразах введення-виводу можна використовувати спеціальні функції, звані маніпуляторами (manipulators).

Розглянемо спочатку засоби форматованого введення-виводу за допомогою прапорів і функцій — членів класу ios.

Форматування за допомогою членів класу ios

Кожен потік пов'язаний з набором прапорів формату, керівників представленням інформації. Клас ios оголошує бітову маску під назвою fmtflags, в якій визначаються наступні значення. (З технічної точки зору ці значення визначені в класі ios_base, який є базовим по відношенню до класу ios.)

adjustfield basefield boolalpha dec fixed floatfield hex internal left oct right scientific showbase showpoint showpos skipws unitbuf uppercase

Ці значення використовуються для установки і скидання прапорів формату. При роботі із старими компіляторами неможливо визначити перерахування fmtflags. У такому разі прапори формату кодуються за допомогою значень, що мають тип long.

Якщо встановлений прапор skipws, при введенні даних з потоку роздільники (пропуски, знаки табуляції і символи переходу на новий рядок) ігноруються. Якщо цей прапор скинутий, роздільники враховуються.

Якщо встановлений прапор left, рядки виводу вирівнюються по лівому краю. Якщо встановлений прапор right, рядки виводу вирівнюються по правому краю. Якщо встановлений прапор internal, між знаком числа і його першою цифрою пропуски вставляються так, щоб число заповнило собою все поле виводу. Якщо жоден з цих прапорів не встановлений, за умовчанням виконується вирівнювання по правому краю.

За умовчанням числові значення виводяться в десятковому вигляді. Проте підставу системи числення можна змінити. Для виведення вісімкових чисел призначений прапор oct. Установка прапора hex дозволяє виводити числа в шістнадцятиричному вигляді. Виведення чисел в десятковому форматі забезпечується прапором dec.

Установка прапора showbase дозволяє вивести на екран підставу системи числення. Наприклад, при виведенні шістнадцятиричних чисел значення 1F буде представлено як 0x1F.

При виведенні чисел в науковому форматі буква е за умовчанням виводиться як рядкова. Крім того, буква х у вісімковому представленні чисел також вважається рядковою. Якщо необхідно вивести ці букви як прописні, слід встановити прапор uppercase.

Установка прапора showpos дозволяє вивести знак перед позитивними числами.

Установка прапора showpoint дозволяє виводити десяткову крапку і незначущі нулі при відображенні десяткових чисел.

Якщо встановлений прапор scintiefic, число виводиться в науковому форматі. Якщо встановлений прапор fixed, десяткове число виводиться в звичайному вигляді. Якщо жоден з цих прапорів не встановлений, компілятор сам вибирає відповідне представлення чисел.

Якщо встановлений прапор unitbuf, то після кожної операції вставки буфер очищається.

Прапор boolalpha дозволяє вводити і виводити булеві значення true і false.

Оскільки числа зазвичай виводяться в десятковому, вісімковому і шістнадцятиричному вигляді, поля dec, oct і hex називають загальним ім'ям basefield. Аналогічно поля left, right і internal називають adjustfield. Крім того, поля scientific і fixed об'єднують загальним ім'ям floatfield.

Функції для роботи з прапорцями формату

Для установки прапора використовується функція setf (). Ця функція є членом класу ios. Вона має наступний вигляд.

fmtflags setf (fmtflags прапори)

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

stream setf (ios : : showpos) ;

Тут ім'я stream означає потік, на який ви хочете вплинути. Звернете увагу на префікс ios:: перед прапором showpos. Він необхідний, оскільки прапор showpos є константою, що перераховує, визначеною в класі ios.

Наступна програма виводить на екран число 100, встановлюючи прапори showpos і showpoint.

#include <iostream>

using namespace std;

int main() {

cout.setf(ios::showpoint);

cout.setf(ios::showpos);

cout « 100.0; // Виводиться число +100.0

return 0;

}

Слід пам'ятати, що функція setf () є членом класу ios і впливає на потоки, створені цим класом. Отже, будь-який виклик функції setf() пов'язаний з конкретним потоком. Сама по собі функція setf() ніколи не викликається. Інакше кажучи, в мові С++ немає концепції глобального статусу формату. Кожен потік підтримує свій власний статус.

Хоча попередня програма є синтаксично правильною, її можна переписати і зробити ефективнішою. Замість декількох викликів функції setf () можна застосувати до її аргументів логічну операцію "АБО". Наприклад, попередні виклики можна замінити одним.

До прапорів можна застосовувати логічну операцію "АБО"

cout.setf(ios::showpoint | ios::showpos);

Оскільки прапори формату визначені в класі ios, доступ до них здійснюється за допомогою імені ios і оператора дозволу області видимості. Наприклад, сам по собі прапор sbowbase не розпізнається. Необхідно уточнити його ім'я ios::specify.

Антиподом функції setf () є функція unsetf (). Ця функція — член класу ios — використовується для скидання одного або декількох прапорів формату і має наступний вигляд.

void unsetf(fmtflags прапори)

Дана функція скидає прапори, задані своїм параметром. (Решта всіх прапорів зберігає свій колишній стан.)

Функція unsetf () ілюструється наступною програмою. Спочатку вона встановлює прапори uppercase і scientific, потім виводить число 100.12 в науковому форматі. В даному випадку науковий формат числа містить прописну букву "Е". Після цього програма скидає прапор uppercase і знову виводить число 100.12 в науковому форматі, цього разу використовуючи рядкову букву "е".

#include <iostream>

using namespace std;

int main() {

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

cout « 100.12; // Виводиться число 1.0012E+02

cout.unsetf(ios::uppercase); // Скидаємо прапор uppercase 

cout « " \n" « 100.12; // Виводиться число 1.0012e+02

return 0;

}

Функція setf () має Перевантажену форму.

fmtflags setf (fmtflags прапори1, fmtflags прапори2) ;

У цій версії змінюються тільки прапори 1, задані параметром прапорці 2. Спочатку вони скидаються, а потім встановлюються відповідно до статусів прапорів, заданих параметром прапори 1. Звернете увагу на те, що навіть якщо параметри прапори 1 і прапорці 2 відносяться до різних прапорів, змінюються тільки прапори, задані параметром флаги2. Функція повертає попередній стан прапорів.

#include <iostream>

using namespace std;

int main( )

{

cout.setf(ios::showpoint | ios::showpos, ios::showpoint);

cout « 100.0; // Виводить на екран число 100.0, а не +100.0

return 0;

}

Програма встановлює прапор showpoint, а не showpos, оскільки прапор showpos не вказаний в другому параметрі.

#include <iostream>

using namespace std;

int main() {

cout.setf(ios::hex, ios::basefield);

cout << 100; // Виводить на екран число 64

return 0 ;

}

У цій програмі спочатку скидаються прапори basefieid (тобто прапори dec, oct і hex), а потім встановлюється прапор hex.

Пам'ятаєте, що стан прапорів, заданих параметром прапори 1, впливає тільки на прапори, задані параметром прапори 2. Наприклад, в наступній програмі перша спроба встановити прапор showpos виявляється невдалою.

// Ця програма не працює

#include <iostream>

using namespace std;

int main()

{

cout.setf(ios::showpos, ios::hex); // Помилка, прапор

// showpos не встановлений.

cout « 100 « '\n'; // Виводить на екран число 100, а не +100

cout.setf(ios::showpos, ios::showpos); // Правильно

cout << 100; // Тепер на екран виводиться число +100.

return 0;

}

Врахуйте, що в більшості випадків для скидання прапорів використовується функція unsetf(), а для установки прапора викликається функція setf() з одним параметром. У складніших випадках, наприклад, при виведенні підстави системи числення слід викликати функцію setf (fmtflags, fmtflags). Крім того, іноді програмісти створюють шаблон всіх прапорів формату, що описує представлення чисел, а потім намагаються змінити один або два прапори. В цьому випадку шаблон задають за допомогою параметра прапори 1, а змінні прапори перераховують в параметрі прапори 2.

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

fmtflags flags();

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

fmtflags flags(fmtflags f);

У цій версії параметр f задає бітовий шаблон прапорів формату, пов'язаних з конкретним потоком. Таким чином, змінюються відразу всі прапори форматування. Функція повертає попередній стан прапорів.

Ця версія функції flags () ілюструється наступною програмою. Спочатку вона створює бітову маску, в якій встановлені прапори showpos, showbase, oct і right. Решта всіх прапорів скинута. Потім для установки прапорів форматування, пов'язаних з потоком cout, використовується функція flags(). Функція showflags () виводить на екран стан прапорів форматування. (Це та ж функція, яка була визначена в попередньому прикладі.)

#include <iostream>

using namespace std;

void showflags();

int main() {

// Виводимо нв екран стан прапорів формату,

// передбачене за умовчанням, showflags();

// Прапори showpos, showbase, oct і right встановлені,

// останні скинуті.

long f = ios::showpos | ios::showbase | ios::oct | ios::right; cout.flags(f); // Задаємо стан всіх прапорів.

showflags();

return 0;

}

У класі ios передбачено три функції-члени, що дозволяють змінювати ширину поля виводу, точність і символ-заповнювач. Вони називаються widthO, precision() і fill () відповідно. Розглянемо кожну з них окремо.

За умовчанням кількість позицій, які займає число при виводі, рівна кількості символів, з яких воно складається. Проте існує можливість змінити мінімальну ширину поля виводу, використовуючи функцію width(). Її прототип показаний нижче.

streamsize width(streamsize w);

Функція повертає попередню ширину поля, а її нове значення задається, параметром w. У деяких реалізаціях ширина поля повинна задаватися при кожному виводі. Якщо цього не зробити, використовується її значення, передбачене за умовчанням. Тип streamsize є одним з варіантів типу int, причому конкретний вибір залежить від компілятора.

Якщо число не цілком заповнює поле, воно доповнюється символом-заповнювачем (за умовчанням — пропуском), щоб довжина числа співпадала з шириною поля. Якщо число не поміщається в поле виводу, воно все одно виводиться повністю. Усікання чисел не проводиться.

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

streamsize precision(streamsize р);

Функція повертає старе значення, а нова кількість цифр після десяткової крапки задається параметром р. За умовчанням після десяткової крапки виводиться 6 цифр. У деяких реалізаціях це значення слід задавати перед кожним виводом, інакше використовуватиметься точність, передбачена за умовчанням.

Крім того, якщо поле виводу не заповнене, воно автоматично доповнюється пропусками. Символ-заповнювач можна змінити, використавши функцію fill (). Її прототип має наступний вигляд.

char fill(char ch);

Функція fill() повертає старий символ-заповнювач, а новим заповнювачем стає символ ch.

Функції width(), precision () і fill () мають Перевантажені версії, одержуючі, але не змінюючі відповідні параметри потоку.

char fill () ; streamsize width(); streamsize precision();

Застосування маніпуляторів формату

Інший спосіб зміни формату заснований на застосуванні спеціальних функцій, званих маніпуляторами (manipulators). Їх можна включати в операторів введення-виводу. Стандартні маніпулятори перераховані в табл. 20.1.

Таблиця. Маніпулятори

Маніпулятори

Призначення

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

boolalpha

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

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

dec

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

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

endl

Виводить символ переходу на новий рядок і очищає буфер

Вивід

ends

Виводить нульовий байт

Вивід

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

base)

Задає підставу системи числення, вказану параметром base

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

setfill(int

ch)

Задає символ-заповнювач сл

Вивід

setiosflags(fmtflags Ј)

Встановлює прапори, вказані параметром f

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

setprecision(int p)

Задає кількість цифр після десяткової крапки

Вивід

setw(int W)

Задає ширину поля, вказану параметром w

Вивід

showbase

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

Вивід

showpoint

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

Вивід

showpos

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

Вивід

skipws

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

Введення

unitbuf

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

Вивід

uppercase

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

Вивід

ws

Ігнорує провідні роздільники

Введення


 

А также другие работы, которые могут Вас заинтересовать

63207. Спадкове право 27.55 KB
  Мета: розкрити основні поняття спадкового права; познайомити учнів з особливостями спадкового права з умовами відкриття спадщини й винесення права на спадщину; виховувати в учнів правову культуру та правову свідомість.
63211. Узагальнення знань за темою «Київська Русь у другій половині XI — першій половині XIII ст.» 380 KB
  Мета: повторити та узагальнити матеріал, вивчений із теми «Київська Русь у другій половині XI — першій половині XIII ст.», підготуватися до уроку тематичного оцінювання; розвивати в учнів уміння аналізувати матеріал, робити висновки, виділяти головне, удосконалювати навички роботи з історичними джерелами...
63214. Сім’я і шлюб 31.36 KB
  Мета: ознайомити учнів з основами сімейного права; залучити їх до роботи з текстом Сімейного кодексу; підвести учнів до розуміння важливості знання та дотримання норм сімейного права; виховувати повагу до людей старшого покоління.