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;

}


 

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

84776. Площадь прямоугольника 69.5 KB
  Наш урок мне бы хотелось начать со слов: «Только то и приятно, что трудно достать» М.Твен Как эти слова можно отнести к нашему уроку математики? Я думаю, мы сегодня испытаем удовольствие от работы. Вам известен автор этих слов? Внимательно посмотрите на экран. Слайд с эпизодом.
84777. Конспект урока обществознания: «Богатые» 33 KB
  Значит к теме нашего урока Богатые мы поставили цель: показать особенности положения в обществе богатых людей. По каким характеристикам людей относят к страте богатых Кто такие богатые люди учащиеся предлагают характеристики На доске выстраивается систематизация особенностей страты богатых...
84778. Основы религиозных культур и светской этики 35.5 KB
  Ключевые понятия: семья, род, родословная, имя рода - фамилия, семейные роли, семейные ценности. Цель: иметь представление о себе как части рода и осознавать, что семья - носитель нравственных ценностей, на основе которых формируются нравственные отношения.
84779. Условный оператор на языке Pascal 81 KB
  Цель: Ребенок, который имеет представление об условном операторе на языке Pascal; умеет писать простейшие программы с условным оператором на языке Pascal. Задачи: систематизация знаний по теме «Условный оператор»; выработка практических умений в разработке программ на языке Pascal...
84780. «В очаровании русского пейзажа». Природа в очерках Константина Паустовского 73 KB
  А природу нашей земли Константин Паустовский знал хорошо. Как была открыта эта земля Паустовский описал в очерке Коротко о себе. Что обозначает этот термин Поэтический прием при котором один предмет или явление сравнивается с другим Давайте вспомним их: Мещерские леса величественны...
84781. Начало Отечественной войны 1812 года 161.5 KB
  Цель урока: Сформировать у обучающихся представления о Отечественной войне 1812 года как героической странице российской истории. Образовательные: проанализировать причины цели и характер войны России с наполеоновской Францией в 1812 году; охарактеризовать основные события войны...
84782. Путешествие по компьютеру 60.5 KB
  Тип урока: урок-повторение с применением игровых технологий Вид: комбинированный урок Технология: личностно-ориентированная игровая Цели урока: Обучающая создать условия для закрепления первичного представления об устройстве компьютера назначении его составных частей и периферийных устройств.
84784. Налоги. Макроэкономика 142.55 KB
  Цели урока: сформировать знания о государственных финансов и налоговой политики. Понятия урока: налог, налоговая система, принципы налогообложения, прямые налоги, косвенные налоги, подохлдный налог, автономный налог, пропорциональный налог, регрессивный налог,