67372
Форматування даних за допомогою функцій-членів класу ios
Лекция
Информатика, кибернетика и программирование
Дотепер під час введення або виведення інформації в наведених вище прикладах програм діяли параметри форматування, які за замовчуванням використовує С++-система введення-виведення. Але програміст може сам керувати форматом представлення даних, причому двома способами.
Украинкский
2014-09-07
645 KB
3 чел.
Лекція № 28
Тема: Форматування даних за допомогою функцій-членів класу ios
План
Дотепер під час введення або виведення інформації в наведених вище прикладах програм діяли параметри форматування, які за замовчуванням використовує С++-система введення-виведення. Але програміст може сам керувати форматом представлення даних, причому двома способами. Перший спосіб передбачає використання функцій-членів класу ios, а другий функцій спеціального типу, що іменуються маніпуляторами (manipulator). У цій темі розглянемо основні можливості форматування даних, починаючи з функцій-членів класу ios, і завершуючи створенням власних маніпуляторних функцій.
У C++-системі введення-виведення кожен потік пов'язаний з набором опцій, які керують процесом форматування даних. У класі ios оголошують перерахунок fmtflags, у якому визначено стандартні значення опцій форматування (табл. 9.2).
Ці значення використовують для встановлення або скидання опцій форматування за допомогою таких функцій: setf() і unsetf(). При використанні старого компілятора може так статися, що він не зможе визначити тип перерахунку fmtflags. У цьому випадку опції форматування кодуватимуться як цілочисельні long-значення.
Оскільки часто доводиться звертатися до полів 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);
Розглянемо код програми, яка демонструє використання цих трьох функцій.
Приклад. Демонстрація механізму використання функцій встановлення ширини поля,
точності та символів заповнення
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(), які не змінюють поточні значення відповідних параметрів форматування і використовуються тільки для їх отримання. Ось як виглядають їх прототипи:
Тема: Маніпулятори введення-виведення даних
У С++-системі введення-виведення передбачено і другий спосіб зміни параметрів форматування даних, пов'язаних з потоком інформації. Він реалізується за допомогою спеціальних функцій так званих маніпуляторів, які можна помістити у вираз введення-виведення. Призначення та функції стандартних С++маніпуляторів введення-виведення описано в табл. 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;
}
А также другие работы, которые могут Вас заинтересовать | |||
388. | Технологическая часть промышленного приборостроения. Характеристика типов производства | 431 KB | |
Характеристика типов производства бывает следующих видов. Сборка и монтаж печатной платы на непрерывно–поточной линии. Численность рабочих на поточной линии. Расчет стоимости основных производственных фондов. | |||
389. | Смоленские Евреи в период Великой Отечественной войне | 2.79 MB | |
Политика антисемитизма в советское время. Освящение массового уничтожения еврейской нации на территории Смоленской. Причины и последствия тактики замалчивания Холокоста и участия евреев в Великой Отечественной войне. | |||
390. | За что я люблю машины. История создания автомобиля | 427 KB | |
РАССКАЗАТЬ О СВОЕЙ ЛЮБВИ К АВТОМОБИЛЯМ. ПОДРОБНЕЕ УЗНАТЬ ИСТОРИЮ СОЗДАНИЯ АВТОМОБИЛЯ. ПОДТВЕРДИТЬ МЫСЛЬ О ТОМ, В СОВРЕМЕННОМ МИРЕ ЖИЗНЬ БЕЗ АВТОМОБИЛЕЙ УЖЕ НЕВОЗМОЖНА. ЧТО ПРИВОДИТ АВТОМОБИЛЬ В ДВИЖЕНИЕ. | |||
391. | Проблемы экономической безопасности России | 128 KB | |
Ключевые тенденции проблематики экономической безопасности. Прикладные аспекты экономической безопасности. Глобализация как угроза экономическому суверенитету государства. Методика определения ключевых проблем экономической безопасности. | |||
392. | Объекты промышленной интеллектуальной собственности | 62.5 KB | |
Объект интеллектуальной собственности, цели и задачи, на решение которых направлен объект. Сравненительный анализ разработанного объекта и прототипа. Разработка объекта промышленной собственности. | |||
393. | Коммуникативная компетенция учителя иностранного языка | 96 KB | |
Теоретические аспекты формирования коммуникативной компетенции в рамках педагогического процесса. Лингвистическая компетенция как одна из составляющих иноязычной коммуникативной компетенции. Коммуникативная компетенция как новый тип содержания образования в школе. | |||
394. | Теория дизайна | 222 KB | |
История понятие термина дизайн. Промышленный и транспортный дизайн. Колористика и суперграфика. Визуальная идентификация, товарные знаки, визуальные коммуникации и ландшафтный дизайн. Примеры дизайна квартир. | |||
395. | Денежная масса и скорость обращения денег | 62 KB | |
Деньги являются важнейшим атрибутом рыночной экономики. Налично-денежное обращение - движение наличных денег в сфере обращения и выполнение ими двух функций (средства платежа и средства обращения). | |||
396. | М.В. Исаковский на Смоленщине | 297.56 KB | |
Связь биографии поэта с историей народа и страны. Народность песенного творчества М.В. Исаковского. Отражение в лирике М. В. Исаковского черт русского национального характера. | |||