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;

}


 

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

32604. Учет долгосрочных и краткосрочных кредитов и займов 48.5 KB
  Операции связанные с получением и погашением банковских кредитов и займов отражаются в бухгалтерском учете на счетах 66 Расчеты по краткосрочным кредитам и займам и 67 Расчеты по долгосрочным кредитам и займам . Причитающиеся по полученным кредитам и займам проценты к уплате отражают по кредиту счета 66 67 в корреспонденции с дебетом счета 91. Суммы полученных организацией краткосрочных кредитов и займов отражаются по кредиту счета 66 Расчеты по краткосрочным кредитам и займам и дебету счетов 50 Касса 51 Расчетные счета 52...
32605. Калькулирование себестоимости продукции животноводства 52.5 KB
  Данные первичных документов по учёту приплода и прироста живой массы систематизируются в отчёте о движении скота и птицы на фермах форма №223АПК. Если мы приходуем приплод и прирост живой массы то Д11 К 20 2 Если мы приходуем молоко шерсть яйца то Д 43 2 К 20 2. Калькулирование себестоимости продукции животноводства Порядок исчисления себестоимости продукции КРС молочного направления В молочном скотоводстве по основному стаду выделяют два объекта калькулирования приплод и молоко по животным на выращивании прирост живой массы и...
32606. Вспомогательными производства 42 KB
  Учёт затрет во вспомогательных производствах ведется на счете 23 Вспомогательные производства. Он имеет следующие субсчета: 23 1 Ремонтные мастерские; 23 2 Ремонт зданий и сооружений; 23 3 Машиннотракторный парк; 23 4 Автомобильный транспорт; 23 5 Энергетические производства хозяйства; 23 6 Водоснабжение; 23 7 Гужевой транспорт; 23 8 Прочие вспомогательные производства. Аналитический учёт по счёту 23 ведут в производственных отчётах по вспомогательным производствам форма № 83АПК который открывается на...
32607. Особенности организации учёта и исчисления себестоимости продукции основных видов промышленных производств 52 KB
  Для первичных документов по учету сырья и выхода готовой продукции предусмотрен отчёт о переработке продукции форма № 180АПК. В первом разделе отчёта учитывается количество израсходованного сырья во втором количество полученной продукции. Схема учета затрат на производство и выхода продукции животноводства представлена на рисунке 6. По дебету счета собираются затраты а по кредиту учитывается выход продукции в течении года по плановой себестоимости с доведением в конце года или месяца до фактической в зависимости от вида производств.
32609. Докладно описати вантажні станції, розташовані на під’їзних коліях, виділивши: 1) умови розміщення станцій; 2) характеристика портових станцій і станцій паромних переправ; 3) характеристика перевантажувальних станцій 146 KB
  Докладно описати вантажні станції розташовані на під’їзних коліях виділивши: 1 умови розміщення станцій; 2 характеристика портових станцій і станцій паромних переправ; 3 характеристика перевантажувальних станцій. 1 В пунктах стикування залізниць різної колії залізничних доріг з іншими видами транспорту і на п к підприємств споруджуються спеціальні вантажні станції. На основній станції виконується передача вагонів від УЗ на п к розформування поїздів і підбір вагонів по окремим пунктам подавання вагонів на вантажні станції або...
32610. Основні норми проектування плану і поздовжнього профілю дільничних станцій 311.5 KB
  Розміщення колій на горизонтальному майданчику полегшує умови рушення поїздів в обох напрямках знижує небезпеку уходу вагонів від товчка при маневрах або під впливом вітру. Станція окремі парки і витяжні колії повинні розташовуватися в плані на прямих дільницях що поліпшує умови видимості під час руху поїзда і маневрової роботи рушенні поїздів з місця. Головні колії на підходах до станції слід проектувати на прямих або кривих можливо більшого радіусу що створює умови для забезпечення безпечності і плавності руху поїздів....
32612. Докладно описати такі питання: – призначення і класифікація сортувальних станцій; – класифікація сортувальних станцій; – основні операції, що виконуються на сортувальних станціях; - основні пристрої, які проектуються на сортувальних станціях 841 KB
  Сортировочные станции СС предназначены главным образом для массовой сортировки вагонов по назначениям плана формирования и организации новых составов сквозных участковых сборных вывозных передаточных и других поездов. Основные операции которые выполняются на СС: операции по формированиюрасформированию поездов передаче вагонов на подъездные пути предприятий промышленного транспорта и приему вагонов с подъездных путей подборке группировке вагонов передач на грузовые станции узла и поездов на портовые и паромные станции а...