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

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

Введення


 

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

24515. Мультипрограммирование на основе прерываний. Механизм прерываний 25.58 KB
  Мультипрограммирование на основе прерываний. Механизм прерываний.Мультипрограммирование на основе прерываний. Назначение и типы прерываний.
24516. Необходимость синхронизации процессов и потоков. Критическая секция 19.14 KB
  Необходимость синхронизации процессов и потоков.4 Синхронизация процессов и потоков. В многозадачной ОС синхронизация процессов и потоков необходима для исключения конфликтных ситуаций при обмене данными между ними разделении данных доступе к процессору и устройствам вводавывода. Пренебрежение вопросами синхронизации процессов выполняющихся в многозадачной системе может привести к неправильной их работе или даже к краху системы.
24517. Способы реализации взаимных исключений путем запрещения прерываний, использования блокирующих переменных, системных вызовов 103.83 KB
  Поток при входе в критическую секцию запрещает все прерывания а при выходе из критической секции снова их разрешает. Это самый простой но и самый неэффективный способ так как опасно доверять управление системой пользовательскому потоку который может надолго занять процессор а при крахе потока в критической области крах потерпит вся система потому что прерывания никогда не будут разрешены. Для синхронизации потоков одного процесса программист может использовать глобальные блокирующие переменные к которым все потоки процесса имеют прямой...
24518. Назначение и использование семафоров 46.4 KB
  Пусть буферный пул состоит из N буферов каждый из которых может содержать одну запись рис. Для решения задачи введем три семафора: e – число пустых буферов; f – число заполненных буферов; b – блокирующая переменная – двоичный семафор используемый для обеспечения взаимного исключения при работе с разделяемыми данными в критической секции. Использование семафоров для синхронизации потоков Здесь операции Р и V имеют следующее содержание: Ре – если есть свободные буферы то уменьшить их количество на 1 если нет то перейти в состояние...
24519. Взаимные блокировки процессов. Методы предотвращения, обнаружения и ликвидации тупиков 35.63 KB
  Методы предотвращения обнаружения и ликвидации тупиков. Тупиковые ситуации надо отличать от простых очередей хотя и те и другие возникают при совместном использовании ресурсов и внешне выглядят похоже: процесс приостанавливается и ждет освобождения ресурса. Проблема тупиков включает в себя решение следующих задач: предотвращение тупиков; распознавание тупиков; восстановление системы после тупиков. Другой более гибкий подход динамического предотвращения тупиков заключается в использовании определенных правил при назначении ресурсов процессам.
24520. Функции ОС по управлению памятью. Типы адресов. Преобразование адресов 40.26 KB
  Сама ОС обычно располагается в самых младших или старших адресах памяти. Функциями ОС по управлению памятью являются: отслеживание свободной и занятой памяти; выделение и освобождение памяти для процессов; вытеснение процессов из оперативной памяти на диск когда размеры основной памяти не достаточны для размещения в ней всех процессов и возвращение их в оперативную память когда в ней освобождается место; настройка адресов программы на конкретную область физической памяти. Программист при написании программы в общем случае обращается...
24521. Методы распределения памяти без использования диска (фиксированными, динамическими, перемещаемыми разделами) 83.87 KB
  Методы распределения памяти без использования диска фиксированными динамическими перемещаемыми разделами. Методы распределения памяти. Рассмотрим наиболее общие подходы к распределению памяти которые были характерны для разных периодов развития ОС. Классификация методов распределения памяти 5.
24522. Понятие виртуальной памяти, ее назначение. Свопинг 14.41 KB
  Понятие виртуальной памяти ее назначение. Понятие виртуальной памяти. Необходимым условием для того чтобы программа могла выполняться является ее нахождение в оперативной памяти. Уже давно пользователи столкнулись с проблемой размещения в памяти программ размер которых превышает имеющуюся в наличии свободную память.
24523. Страничное распределение оперативной памяти 90.7 KB
  В общем случае размер виртуального адресного пространства не является кратным размеру страницы поэтому последняя страница каждого процесса дополняется фиктивной областью. Чтобы упростить механизм преобразования адресов размер страницы обычно выбирается равным 2n: 512 1024 и т. Смежные виртуальные страницы не обязательно располагаются в смежных физических страницах. Запись таблицы называемая дескриптором страницы включает следующую информацию: номер физической страницы в которую загружена данная виртуальная страница; признак...