67372

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

Лекция

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

Дотепер під час введення або виведення інформації в наведених вище прикладах програм діяли параметри форматування, які за замовчуванням використовує С++-система введення-виведення. Але програміст може сам керувати форматом представлення даних, причому двома способами.

Украинкский

2014-09-07

645 KB

0 чел.

Лекція № 28

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

План

  1.  Форматне введення-виведення даних
  2.  Форматування даних з використанням функцій-членів класу ios

  1.  Форматне введення-виведення даних

   Дотепер під час введення або виведення інформації в наведених вище прикладах програм діяли параметри форматування, які за замовчуванням використовує С++-система введення-виведення. Але програміст може сам керувати форматом представлення даних, причому двома способами. Перший спосіб передбачає використання функцій-членів класу ios, а другий – функцій спеціального типу, що іменуються маніпуляторами (manipulator). У цій темі розглянемо основні можливості форматування даних, починаючи з функцій-членів класу ios, і завершуючи створенням власних маніпуляторних функцій.

  1.   Форматування даних з використанням функцій-членів класу ios

    У C++-системі введення-виведення кожен потік пов'язаний з набором опцій, які керують процесом форматування даних. У класі ios оголошують перерахунок fmtflags, у якому визначено стандартні значення опцій форматування (табл. 9.2).

   Ці значення використовують для встановлення або скидання опцій форматування за допомогою таких функцій: setf() і unsetf(). При використанні старого компілятора може так статися, що він не зможе визначити тип перерахунку fmtflags. У цьому випадку опції форматування кодуватимуться як цілочисельні long-значення.

  1.  Якщо опція skipws встановлена, то при потоковому введенні даних провідні "пропускні" символи, або символи пропуску (тобто пропуски, символи табуляції та нового рядка), відкидаються. Якщо ж опція skipws скинута, то пропускні символи не відкидаються.
  2.   Якщо встановлено опцію left, то дані, що виводяться, вирівнюються лівим краєм, а якщо встановлено опцію right – то правим краєм. Якщо встановлено опцію internal, то числове значення доповнюється пропусками, якими заповнюється поле між ним і знаком числа або символом основи системи числення. Якщо жодну з цих опцій не встановлено, то результат вирівнюється правим краєм за замовчуванням.
  3.  За замовчуванням числові значення виводяться у десятковій системі числення. Проте основу системи числення можна змінити. Встановлення опції oct приведе до виведення результату у вісімковому представленні, а встановлення опції hex – в шістнадцятковому. Щоб під час відображення результату повернутися до десяткової системи числення, достатньо встановити опцію dec.
  4.   Встановлення опції showbase приводить до відображення позначення основи системи числення, у якій представляються числові значення. Наприклад, якщо використовується шістнадцяткове представлення, то значення 1F буде відображено як 0x1F.
  5.   За замовчуванням при використанні експоненціального представлення чисел відображається рядковий варіант букви "е". Окрім цього, під час відображення шістнадцяткового значення використовують також рядкову букву "x". Після встановлення опції uppercase відображається прописний варіант цих символів.
  6.  Встановлення опції showpos викликає відображення провідного знаку "плюс" перед позитивними значеннями.
  7.  Встановлення опції showpoint приводить до відображення десяткової крапки і хвостових нулів для всіх чисел з плинною крапкою – потрібні вони чи ні.
  8.  Після встановлення опції scientific числові значення з плинною крапкою відображаються в експоненціальному представленні. Якщо встановлено опцію fixed, то дійсні значення відображаються у звичайному представленні. Якщо не встановлено жодну з цих опцій, то компілятор сам вибирає відповідний формат їх представлення.
  9.  При встановленому опції unitbuf вміст буфера скидається на диск після кожної операції виведення даних.
  10.  Якщо встановлено опцію boolalpha, то значення булевого типу можна вводити або виводити, використовуючи ключові слова true і false.

   Оскільки часто доводиться звертатися до полів oct, dec і hex, то на них допускається колективне посилання ios::basefield. Аналогічно поля left, right і internal можна узагальнено назвати ios::adjustfield. Нарешті, поля scientific і fixed можна назвати ios::floatfield.

   Для встановлення будь-якої опції використовується функція setf(), яка є членом класу ios. Ось як виглядає її формат:

fmtflags setf(fmtflags flags);

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

stream.setf(ios::showbase);

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

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

void main()

{

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

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

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

}

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

+123 +1.232300е+002

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

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

         позитивним значенням

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

   Щоб скинути опцію, потрібно використовувати функцію unsetf(), прототип якої має такий вигляд:

void unsetf(fmtflags flags);

   У цьому випадку будуть очищені опції, що задаються параметром flags. При цьому всі інші опції залишаються у попередньому стані.

   Для того, щоби дізнатися про поточні установки опцій форматування, потрібно скористатися функцією flags(), прототип якої має такий вигляд:

fmtflags flags();

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

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

fmtflags flags(fmtflags flags);

   

    Щоб зрозуміти, як працюють функції flags() і unsetf(), розглянемо детально наведену нижче програму. Вона містить функцію showflags(), яка відображає поточний стан опцій форматування потоку інформації.

Приклад. Демонстрація механізму використання функцій flags() і unsetf()

 

void showflags(ios::fmtflags f);             // Відображення поточного стану опцій

int main()

{

ios::fmtflags f;              // Оголошення параметру для поточного стану опцій

f = cout.flags();             // Отримання поточного стану опцій

showflags(f);                 // Відображення поточного стану опцій

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

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

f = cout.flags();             // Отримання поточного стану опцій

showflags(f);                // Відображення поточного стану опцій

         // Скидання опції, що відображає числа в експоненціальному вигляді

cout.unsetf(ios::scientific);

f = cout.flags();            // Отримання поточного стану опцій

showflags(f);               // Відображення поточного стану опцій

getch(); return 0;

}

void showflags(ios::fmtflags f)               // Відображення поточного стану опцій

{

long i;

for(i=0x4000; i; i = i >> 1)

 if(i & f)

  cout << "1 ";

 else

  cout << "0 ";

cout << endl;

}

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

0 0 0 0 0 1 0 0 0 0 0 0 0 0 1

0 0 1 0 0 1 0 0 0 1 0 0 0 0 1

0 0 0 0 0 1 0 0 0 1 0 0 0 0 1

   У наведеному вище коді програми зверніть увагу на те, що тип fmtflags вказано з префіксом ios::. Йдеться про те, що тип fmtflags визначено у класі ios. У загальному випадку при використанні імені типу або перерахованої константи, визначеної у певному класі, необхідно вказувати відповідне ім'я разом з іменем класу.

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

          заповнення

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

streamsize width(streamsize len);

char fill(char ch);

streamsize precision(streamsize num);

  1.  Функція width() повертає поточну ширину поля і встановлює нову, що дорівнює значенню параметра len. Ширина поля, яка встановлюється за замовчуванням, визначається кількістю символів, необхідних для зберігання даних у кожному конкретному випадку.
  2.   Функція fill() повертає поточний символ заповнення (за замовчуванням використовується пропуск) і встановлює як новий поточний символ заповнення значень, які задаються параметром ch. Цей символ використовують для доповнення результату символами, яких не вистачає для досягнення заданої ширини поля.
  3.   Функція precision() повертає поточну кількість цифр, що відображаються після десяткової крапки, і встановлює нове поточне значення точності, що дорівнює значенню параметра num1. Тип streamsize визначено як цілочисельний.

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

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

                 точності та символів заповнення

void main()

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

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

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

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

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

cout << 123 << " ";

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

cout << 123.23 << endl;

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

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

cout << 123 << " ";

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

cout << 123.23;

}

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

+123 +1.232300е+002

+123 +1.23е+002

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

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

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

  •  streamsize width() – повертає поточну ширину поля;
  •  char fill() – повертає поточний символ заповнення;
  •  streamsize precision() – повертає поточну кількість цифр, що відображаються після десяткової крапки.

Тема: Маніпулятори введення-виведення даних

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

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

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

Приклад. Демонстрація механізму використання маніпуляторів для керування процесом

                 форматування даних, які виводяться

#include <iostream>

#include <iomanip>                // Використання маніпуляторів введення-виведення

using namespace std;

void main()

{

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

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

}

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

1е+003

Всім привіт!

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

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

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

                 встановлення опцій scientific і showpos

void main()

{

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

cout << setiosflags(ios::showpos);

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

cout << setiosflags(ios::scientific);

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

}

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

+123 +1.232300е+002

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

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

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

 

void main()

{

char str[80];

cin >> ws >> str;

cout << str;

}


 

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

78515. Операционные системы: управление файлами и файловые системы 28.5 KB
  Файловая система NTFS. Файл в системе NTFS это не просто линейная последовательность байтов как в системе FT. Отличительными свойствами ФС NTFS являются: Поддержка больших файлов и больших дисков объемом до 264 байт. Структура тома раздела NTFS: Все пространство тома NTFS представляет собой либо файл либо часть файла.
78516. Основные характеристики и особенности организации современных операционных систем 26.5 KB
  Типы ОС: общие специальные и специализированные бортовой автокомпьютер CISCO управление коммутаторами и маршрутизаторами Общая характеристика Windows XP. Windows XP объединяет в себе лучшие качества предыдущих версий Windows: надежность стабильность и управляемость от Windows 2000 простой и понятный интерфейс а также технологию Plug Ply от Windows 98. В Windows XP появился новый более эффективный интерфейс пользователя включающий новые возможности группировки и поиска документов новый внешний вид возможность быстрого...
78517. Основные задачи системного администрирования и их практическая реализация 33 KB
  Важнейшей сферой профессиональной деятельности специалистов в области информационных технологий является управление администрирование функционированием ОС как отдельных компьютеров так и их групп объединенных в вычислительные сети. Системное администрирование в общем случае сводится к решению следующих основных задач: управление и обслуживание пользователей вычислительной системы создание и поддержка учетных записей пользователей управление доступом пользователей к ресурсам; управление и обслуживание ресурсов вычислительной системы ...
78518. Понятие, назначение и основные принципы организации распределенной обработки информации. Архитектура, свойства и характеристики распределенных систем 29.5 KB
  Понятие назначение и основные принципы организации распределенной обработки информации. Под распределенной обработкой информации понимается комплекс операций с информацией проводимый на независимых но связанных между собой ВМ предназначенных для выполнения общих задач. Возможность взаимодействия вычислительных систем при реализации распределенной обработки информации определяют как их способность к совместному использованию данных или к совместной работе с использованием стандартных интерфейсов. Целью распределенной обработки информации...
78519. Концепции и механизмы практической реализации распределенной обработки информации 27 KB
  Концепции и механизмы практической реализации распределенной обработки информации. Одним из исторически первых механизмов реализации распределенной обработки информации является механизм удаленного вызова процедур RPC который поддерживает синхронный режим коммуникаций между двумя прикладными модулями клиентом и сервером. RPC реализует в распределенной среде принципы традиционного структурного программирования. Применение объектно-ориентированного подхода способствует значительному усовершенствованию механизмов организации распределенной...
78520. Эволюция технических средств в обработке информации. Классификация, структурное построение и основные параметры вычислительных машин 28 KB
  Классификация структурное построение и основные параметры вычислительных машин. Предшественниками вычислительных машин были механические и электромеханические счетные устройства. Эта машина во многом была прообразом современных универсальных вычислительных машин. Лебедевым независимо от фон Неймана были сформулированы более детальные и полные принципы построения электронных цифровых вычислительных машин которые были применены при создании первых отечественных разработок ВМ Первый период 19451955.
78521. Основные аппаратные составляющие и перифирийные устройства компьютеров, их назначение, типы, принципы функционирования и характеристики 33 KB
  Процессор является основным вычислительным устройством ВМ в задачу которого входит исполнение находящейся в памяти машины программы. Процессор является основным вычислительным узлом ПК в задачу которого входят исполнение находящейся в памяти программы. сам по себе процессор и остальные элементы контроллеры памяти интерфейсы шины КЭШ память...
78522. Вычислительные системы: общие понятия, классификация, структурные схемы, характеристики 159.5 KB
  Одним из эффективнейших направлений развития вычислительной техники стало построение так называемых многомашинных вычислительных систем ММВС Принципиальным отличием ММВС от многопроцессорных ВМ является то что входящие в состав ММВС отдельные ВМ или и отдельные так называемые вычислительные модули ВМод включающие центральный процессор основную память интерфейсное устройство и возможно дисковую память имеют свою собственную основную память. Вычислительные машины или и вычислительные модули связываются между собой посредством...
78523. Понятие и классификация вычислительных сетей. Модель многоуровневого сетевого взаимодействия 27 KB
  COWS кластар рабочих станций NOWS сеть рабочих станций Основной классифицирующей характеристикой ВС является их масштабная территориальная характеристика: локальные вычислительные сети и глобальные вычислительные сети ГВС и региональные городские РВС. Сети отделов. Сети кампусов изначально преследовали цель объединения нескольких мелких локальных сетей в одну. Корпоративные сети в рамках одного предприятия.