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

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

Введення


 

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

20403. ПРОБЛЕМЫ ИНФОРМАТИЗАЦИИ В МВД РОССИИ 2.52 MB
  Сложность информационного обеспечения процессов принятия решений часто связана с ограниченностью информации ее вероятностным характером негарантированной достоверностью отсутствием у субъекта управления необходимого времени. Информатизация управления преследует следующие цели: повышение научной обоснованности и качества принимаемых решений благодаря использованию математических методов и моделей; повышение гибкости управления его способности реагировать на изменения условий деятельности органов внутренних дел; повышение...
20404. КРИМИНАЛИСТИЧЕСКАЯ ЭКСПЕРТИЗА МАТЕРИАЛОВ, ВЕЩЕСТВ И ИЗДЕЛИЙ 573 KB
  66 M67 ІВ книге рассматриваются научные основы и современное состояние экспертной практики криминалистического исследования материалов веществ и изделий с помощью комплекса аналитических методов спектральных рентгенографических хроматографических и других. ВИТАЛИЙ СТЕПАНОВИЧ МИТРИЧЕВ КРИМИНАЛИСТИЧЕСКАЯ ЭКСПЕРТИЗА МАТЕРИАЛОВ ВЕЩЕСТВ И ИЗДЕЛИЙ ИБ 568 Редактор Л. Советская криминалистика опираясь на достижения естественных и технических наук призвана вооружать следователей самыми современными и эффективными научными приемами...
20405. УГОЛОВНЫЙ ПРОЦЕСС США (досудебные стадии) 840.5 KB
  Пешков УГОЛОВНЫЙ ПРОЦЕСС США досудебные стадии УЧЕБНОЕ ПОСОБИЕ Москва ЗАО Бизнесшкола ИнтелСинтез 1998 махов В. У26 Уголовный процесс США досудебные стадии. Через структуру досудебных стадий уголовного процесса США авторы рассматривают в книге проблемы защиты конституционных прав личности механизм действия ареста и обыска правовой статус и полномочия государственного обвинителя прокурора электронное наблюдение и прослушивание институт сделки о признании вины в уголовном процессе США. На большом фактическом материале проведен...
20406. Вызовы и угрозы ОДКБ 57 KB
  Выявить вызовы и угрозы, с которыми сталкивается ОДКБ на современном этапе своего развития. О нестройности политических действий ОДКБ, которые должны были бы быть совместными (в названии ясно фигурирует «о коллективной…») и взаимосогласованными, говорят много примеров
20407. Международное частное право и нотариальная деятельность 1.66 MB
  Вопервых это особенности правоприменительного процесса в котором особое содержание приобретают такие его традиционные стадии как квалификация материального правоотношения выбор применимых норм права и собственно их применение гл. В этом смысле деятельность нотариуса при столкновении с правовой ситуацией имеющей связь с иностранным правопорядком включает несколько стадий: ┌───────────────────────────────────────────────────────────────────────┐ │ Квалификация правовой ситуации как включающий иностранный элемент │...
20408. УГОЛОВНО-ИСПОЛНИТЕЛЬНОЕ ПРАВО 324 KB
  Медведев УГОЛОВНОИСПОЛНИТЕЛЬНОЕ ПРАВО Уфа 2001 Контрольный листок сроков возврата Книга должна быть возвращена не позже указанного здесь срока кол. пред выдяч МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ БАШКИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ УГОЛОВНОИСПОЛНИТЕЛЬНОЕ ПРАВО Учебное пособие в схемах и определениях Медведев Ю. Уголовноисполнительное право: Учебное пособие в схемах и определениях Изде Башкир унта. ISBN 5747705075 С учетом последних изменений и дополнений законодательства в учебном пособии поновому рассматриваются...
20409. УГОЛОВНЫЙ ПРОЦЕСС. Консультации образцы документов судебная практика 3.9 MB
  Серия Справочник адвоката ISBN 5840100099 В справочнике подробно рассмотрены особенности работы адвоката начиная с составления необходимых документов в стадии доследственной проверки заявления и заканчивая подачей жалобы о принесении протеста в порядке надзора а также ведения дела в Международном суде по правам человека. Не случайно уголовные дела прекращаются по различным основаниям как говорят следователи разваливаются чаще всего именно на стадии предварительного следствия а не в судебной инстанции хотя казалось бы все...
20410. Складання процесуальних актів у кримінальних справах 974 KB
  БУРЛАКОВ заслужений юрист України НАУКОВИЙ РЕЦЕНЗЕНТ: Г.Михайленко 1996 Юрінком редакція Бюлетеня законодавства і юридичної практики України 1996 ПЕРЕДМОВА Українською державою приділяється велика увага підготовці висококваліфікованих спеціалістів для державного господарського і соціальнокультурного будівництва які мають володіти ґрунтовними теоретичними знаннями і практичним досвідом. Так КПК України' передбачає складання понад 130 різних постанов 80 ухвал 40 протоколів і т. Даний посібник підготовлений на основі...
20411. Складання процесуальних актів у кримінальних справах. Навчальний посібник 1.12 MB
  ПК України1 передбачає складання понад 130 різних постанов 80 ухвал 40 протоколів і т. Даний посібник підготовлено на основі кримінальнопроцесуального законодавства України містить теоретичні і методичні розробки а також зразки кримінальнопроцесуальних документів які торкаються всіх стадій кримінального судочинства. Він написаний з врахуванням вимог КПК і КК Украї Надалі мається на увазі КПК України якщо не зазначено інше. Це ускладнює використання зразків документів які в них містяться рекомендацій щодо їх складання органами...