67372

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

Лекция

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

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

Украинкский

2014-09-07

645 KB

2 чел.

Лекція № 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;

}


 

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

37842. ИССЛЕДОВАНИЕ ПРОСТЕЙШИХ ФИЛЬТРОВ 132 KB
  Схема полосового фильтра Резонансная частота = 2457 кГц Для определения левой и правой резонансной частоты возьмем максимальную точку на графике и...
37843. ПРИБЛИЖЕНИЕ ФУНКЦИЙ МЕТОДОМ НАИМЕНЬШИХ КВАДРАТОВ 304 KB
  Метод среднеквадратического приближения функций заданных набором экспериментальных данных называется методом наименьших квадратов МНК. Рассмотрим применение метода наименьших квадратов для среднеквадратического приближения функции полиномом степени . Метод наименьших квадратов наиболее просто применить когда искомые параметры входят в аппроксимирующую зависимость линейно.
37844. Комп’ютерна електроніка та схемотехніка. Лабораторний практикум 1.78 MB
  Цель работы: Приобрести минимально необходимые навыки работы с пакетом EWD 4.0. Исследовать схемы пассивных RС – фильтров в частотной и временной области.
37845. ИССЛЕДОВАНИЕ ОСНОВНЫХ МЕТРОЛОГИЧЕСКИХ ХАРАКТЕРИСТИК ЭЛЕКТРОМЕХАНИЧЕСКИХ ИЗМЕРИТЕЛЬНЫХ ПРИБОРОВ 204 KB
  Определить основную погрешность комбинированного измерительного прибора тестера в следующих режимах работы: вольтметра постоянного тока вольтметра переменного тока миллиамперметра постоянного тока. Определить амплитудночастотную характеристику АЧХ вольтметра переменного тока. Построить график АЧХ определить рабочую полосу частот вольтметра. Для поверки вольтметра собрать поверочную схему рис.
37846. ЭЛЕКТРОННО-ЛУЧЕВОЙ ОСЦИЛЛОГРАФ 595 KB
  Оценить погрешности измерений используя результаты исследования осциллографа и его метрологические характеристики указанные в описании. Объекты измерений задаются преподавателем. ОБРАБОТКА РЕЗУЛЬТАТОВ ПРЯМЫХ И КОСВЕННЫХ ИЗМЕРЕНИЙ Цель работы ознакомление с методами обработки результатов прямых и косвенных измерений при однократных и многократных измерениях. 2 при наличии относительно больших случайных погрешностей число измерений и уровень случайных погрешностей задаются преподавателем.
37848. Розробка алгоритмів задач з використанням складних структур 163 KB
  Преподаватель Егорова Кривой рог 1997 Контрольні запитання: Яка структура має назву списки Яким чином у мові С описується список Що таке стек Що таке черга Чим відрізняється черга від стека та списку Теоретичні відомості: Покажчики. Кількість елементів у послідовності називається довжиною списку. При роботі з списками часто доводиться виконувати такі операції: знайти елемент із заданною властивістю; визначити iй елемент у лінійному списку; внести додатковий елемент до або після вказанного вузла; вилучити певний елемент зі...
37849. Знайомство з середовищем програмування DELPHI 411.5 KB
  Borlnd Delphi 7 Studio дозволяє створювати самі різні програми: від найпростіших одновіконних додатків до програм керування розподіленими базами. 5 яких можна побачити відсунувши убік вікно форми треба набирати текст програми. На початку роботи над новим проектом це вікно редактора коду містить сформований Delphi шаблон програми. Так на етапі розробки програми називають діалогові вікна.
37850. Створення форм 66.5 KB
  Помістити обєкт Lbel у вікно форми Form1. Вибрати в палітрі компонентів на сторінці стандартних компонентів компонентів Lbel. Обєкт буде доданий у форму і за замовчуванням одержить імя Lbel1. Перемістити обєкт Lbel1 на бажане місце у формі.