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;

}


 

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

81765. Своеобразие композиции романа А.С.Пушкина «Евгений Онегин» 33.37 KB
  Чтение наизусть отрывка из романа Евгений Онегин . В годы создания романа Пушкину пришлось пережить ссылку потерять многих друзей испытать горечь от гибели лучших людей России того времени. Ее духовный и нравственный облик представлен в героях романа Евгении Онегине и Ленском.
81766. Социальная и философская проблематика пьесы М. Горького «На дне» 32.62 KB
  изображением дна являющегося изнанкой современного буржуазного строя Горький утверждал мысль о необходимости решительного обновления этого строя во имя освобождения человека. Горький поновому показал босяка дав строго реалистический анализ бродяжного люда ни разу не отрываясь от трезвого взгляда на босячество как на явление в основе своей антисоциальное. Горький усилил и художественно обобщил одну черту босяка его презрение к мещанским предрассудкам к мещанской морали к мещанскому фетишизму вещей и понятий. Горький использовал эту...
81767. Роль пейзажа в произведениях отечественной литературы 31.46 KB
  В рассказе Хорь и Калиныч Калиныча более трогали природа горы водопад. чутко воспринял тему человек и природа В рассказе того же цикла Бежин луг описание природы начинает повествование. Это рассказ о том что природа сильнее человека и поэтому надо с уважением к ней относиться. Главный герой романа Евгений Базаров так выражает свои отношения с природой: Природа пустяки Природа не храм а мастерская и человек в ней работник Но далее читаем: Солнце жгло изза тонкой завесы сплошных беловатых облаков.
81768. Татьяны «милый идеал» в романе А.С.Пушкина «Евгений Онегин». Роль сна Татьяны в развитии сюжета 37.82 KB
  Точными деталями Пушкин напоминает о характере жизни крепостной деревни крестьянства. На этом широком фоне воссоздана в Евгении Онегине драматическая судьба лучших людей пушкинского времени передовой дворянской интеллигенции эпохи декабристов. Образ Евгения Онегина обобщает собой все что Пушкин стремился воплотить в образах кавказского пленника и Алеко. Пушкинский герой порождение этого общества но вместе с тем он и чужд ему.
81769. Герои и проблематика одного из произведений А. Платонова 47.7 KB
  Платонова. Платонов Наше узнавание Платонова было длительным: с 20х годов до сегодняшнего дня. Почему многие произведения Андрея Платонова совсем не были опубликованы при его жизни а те что были напечатаны вызывали резко критическое отношение Почему Сталин прочитав бедняцкую хронику Впрок не пожалел самых ругательных выражений а Горький высоко оценив Чевенгур считал что роман этот опубликован не будет Попробуем ответить на эти вопросы. Все это в той или иной степени отразилось в творчестве Платонова от первого сборника стихов ...
81770. Мотивы преступления и возмездия в произведениях отечественной литературы 45.61 KB
  В художественном арсенале Достоевского можно обнаружить множество средств к которым он прибегает при обрисовке Раскольникова. Портрет Раскольникова набросан лаконично: Кстати он был замечательно хорош собою с прекрасными темными глазами темнорус роста выше среднего тонок строен. Особенно обстоятельно Достоевский рассматривает мотивы преступления Раскольникова. В раскрытии безмерности издевательств над людьми и поругания всего живого большое значение приобретает символический сон Раскольникова из V главы где предстаёт зверское...
81771. Образ Маши Мироновой и смысл названия романа 32.62 KB
  И к Екатерине Маша обращается с прошением о помиловании о милости а не о просьбе соблюсти закон. Маша обращается к Екатерине как к матери Отечества мотив материнства и отцовства очень важен для Пушкина. Маша Миронова и Петр Гринев заслужили свое счастье т. Маша и Гринев преодолевая трудности все испытания которые выпали на их долю спасаются любовью.
81772. Тема героя и толпы в произведениях отечественной литературы 31.76 KB
  Горький Старуха Изергиль Герои притч старухи Изергиль Ларра и Данко являются по сути вариациями на одну и ту же тему: оба они герои байронического типа сильные личности противопоставленные толпе посредственностей. И толпа губит и положительного Данко и отрицательного Ларру. Геройромантик либо гибнет как Данко либо замыкается в своем страдании и одиночестве отвергнутый обществом против условностей которого протестовал как Ларра. Свобода Данко напротив это свобода взять на себя ответственность за коллектив свобода...
81773. Основные мотивы и образы лирики М.Ю.Лермонтова ( на примере 3 – 4 стихотворений). Чтение наизусть и разбор одного стихотворения 34.41 KB
  Мотив одиночества возникает у Л. в трактовку темы одиночества это прежде всего его абсолютный и глубоко личный характер связанный с неприятием лермонтовским героем мира коренных основ миропорядка. В этой благодарности за все чем я обманут в жизни был обнажается двойственная природа лермонтовского одиночества; враждебный человеку мир с отъединенностью от врагов и друзей и волевое гордое непримиренное Я поэта не желающее пойти на какойлибо компромисс с этим миром ни перед чем не останавливающееся в противостоянии ему...