Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи по програмуванні(14 лаб).doc
Скачиваний:
77
Добавлен:
16.05.2015
Размер:
1.43 Mб
Скачать

Форматування даних при обмінах з потоками

Для форматування даних при обміні з потоками існують такі засоби:

- прапори форматування дозволяють виводити значення з різноманітним вирівнюванням;

- комбінації прапорів поєднують за допомогою диз'юнкції;

- маніпулятори дозволяють використати себе в якості правого операнда операцій << і >> (cout<<модифікатор).

Безпосереднє застосування операцій виведення << (включення в потік) і введення >>; (витяг з потоку) до стандартних потоків cout, cin, cerr, clog для даних базових типів приводить до використання "замовчуваних" форматів зовнішнього представлення значень, що пересилаються. Наприклад, при виведенні чисел кожне з них займає рівно стільки позицій, скільки необхідно для його представлення. Це не завжди зручно і правильно. Наприклад, виконання операторів

int il= 1, i2 = 2, i3 = 3, i4 = 4, i5 = 5;

cout « "\n" « i1 « i2 « i3 « i4 « i5;

приведе до такого результату: 12345

Для поліпшення читання найпростіше явно ввести розділові пробіли. Виконавши оператор

cout « "\n"« i1 ‘ ’« i2 ‘ ’« i3 ‘ ’« i4 ‘ ’« i5 ‘

одержимо більш наочний результат: 12345

Наступний крок - додавання пояснювального тексту і(чи) символів табуляції. Ширина (кількість позицій) зовнішнього представлення кожного числа вибирається автоматично, виходячи з необхідної кількості позицій. Однаковість не завжди влаштовує користувача програми. Наприклад, періодичний дріб 1.0 / 3.0 можна представити дуже різними способами:

0.3 0.3333 3.3е-1 0.3333333е0

Однак стандартне представлення при виведенні за допомогою оператора

cout « "\nl.0/3.0 = " << 1.0 / 3.0;

буде завжди однаковим:

1.0 / 3.0 = 0.333333

Формати представлення виведеної інформації і правила сприйняття даних, що вводяться з потоку, можуть бути змінені програмістом за допомогою прапорів форматування. Прапори: реалізовані у виді окремих фіксованих битов чисел типу long, тому кілька прапорів за допомогою логічних бітових виражень можна поєднувати, тим самим по-різному комбінуючи властивості потоку.

Типи прапорів форматування представлені в таблиці 13.1.

Крім прапорів для керування форматом використовуються компонентні змінні класу ios (табл. 13.2).

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

//Р11-02.СРР - форматування виведеної інформації

(include <strstrea.h>

void main ()

(char name[] = "Рядок довжиною 52 символу "

"у поле шириною 58 позицій,";

cout «n\n";

cout.width(58); // Ширина поля виводиться для потоку cout

// Символ заповнення порожніх позицій поля: cout.fill('$');

// Перший вивід рядка в потік cout:

cout <<name<<endl;

cout. width (58) ; // Забрати не можна

// Заповнювач між знаком і значенням:

cout.setf (ios: : internal) ;

double dd = -33.4455;

cout « dd « endl; // Вивід речовинного значення

cout. width ( 58 ); // Забрати не можна

// Зміна вирівнювання :

cout.setf (ios: :left,ios :: adjustfield) ;

// Символ заповнення порожніх позицій поля:

cout.fill(#);

// Другий висновок рядка в потік cout:

cout « name « endl;

long nn = 90000; // Шіснадцяткове значення Oxl5f90

// Зміна підстави числення:

cout.setf (ios: : hex, ios: :basefield) ;

// Виводити ознака підстави числення:

cout.setf (ios: :showbase) ;

// Перехід на верхній регістр :

cout.setf (ios: : uppercase) ;

cout. width (58 ); // Забрати не можна

cout « nn « endl; // Вивід цілого значення типу long

cout, width (58 ); // Забрати не можна

// Зміна вирівнювання:

cout . setf (ios : : internal , ios : : adjustfield) ;

// Символ заповнення порожніх позицій поля:

cout. fill ('$') ;

cout. unsetf (0x0200) ; // Перехід на нижній регістр

cout « nn « endl; // Вивід цілого значення типу long

}

Результат виконання програми:

$$$$$$Рядок довжиною 52 символу в поле шириною 58 позицій.-$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$33.4455

Рядок довжиною 52 символу в поле шириною 58 позицій. ####§!

Ox$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$15f90

Прокоментуємо програму і результати. За замовчуванням ширина поля виведення встановлюється рівній довжині прийнятого представлення виведеного значення. Тому дія функції width() однократне, і її потрібно при кожному виведенні значення явно використовувати, якщо значення ширини, що замовчується, поля виведення не влаштовує програміста. Функція fill () установлює символ заповнення порожніх позицій поля. При першому виведення рядка name[] за замовчуванням установлене вирівнювання по правому краї поля, і символи $ поміщені ліворуч від умісту рядка. Перед виведенням значення дійсної перемінний dd функцією setf() установлений прапор internal. Під його впливом символ заповнення розмістився між знаком '-' і числовим значенням 33.4455. Ширина поля явно зазначена в 58 позицій.

Перед другим виводом рядка name[] "під впливом" другого параметра (adjustfield) функції setf () скинуті прапори right і internal і явно встановлений прапор left вирівнювання по лівому краї. Змінено символ заповнення порожніх позицій ‘#'. Перед виводом довгого цілого числа nn установлена підстава системи числення (basefield - скидає прапори основ числення; hex - явно встановлює шістнацяткову підставу). Установлено прапори showbase і uppercase і ширина поля виведення.

Число 90000 виведене в шіснацятковому виді, ознакою 0х позначена підстава системи числення, для зображення цифр і ознаки підстави використовуються прописні букви. Тому що при переході до вирівнювання по лівому краї прапор internal виявився скинутим, то символ заповнення '#' розміщений не після ознаки підстави числення ох, а заповнює праву порожню частину поля. Заключний вивід значення nn, рівного 90000, виконаний із прапорами internal і left. Для переходу на нижній регістр використана функція unsetf () з явним значенням прапора uppercase.

Таблиця 13.1 – Типи прапорів

Назва

      1. Пояснення їхньої дії

skipws - 0x0001

при такім значенні прапора операція вилучення з потоку >>буде ігнорувати (пропускати) узагальнені пробільні символи;

left = 0x0002

вивід значення з лівим вирівнюванням (пригорнути до лівого краю поля);

right = 0x0004

вивід значення з правим вирівнюванням (це значення встановлюється за замовчуванням);

Internal = 0x0008

прийнятий як заповнювач символ (за замовчуванням пробіл) міститься між числовим значенням і знаком числа або ознакою підстави системи числення (див. нижче компонент ios::x_fill);

dec=0x0010

десяткова система числення;

oct =x0020

вісімкова система числення;

hex = x0040

Шіснацяткова система числення;

showbase=0x0080

надрукувати при виведеннік ознак системи числення (0х шіснацяткових чисел, 0 - для восьмеричних чисел);

showpoint=0x0100

при виведенні дійсних чисел обов'язково друкувати десяткову крапку і наступні за нею нулі (навіть для речовинного числа, що має нульову дробову частину);

uppercase=0x0200

при виведенні дійсних чисел обов'язково друкувати десяткову крапку і наступні за нею нулі (навіть для речовинного числа, що має нульову дробову частину);

showpos = 0x0400

друкувати знак числа (символ '+') при виведенні позитивних - чисел ;

scientific = 0x0800

для дійсних чисел (float, double) використовувати представлення у форматі з крапкою, що плаває, (наукове представлення), тобто з указівкою порядку і мантиси, що має одну ненульову (значущу) цифру перед крапкою;

Продовження таблиці 13.1 – Типи прапорів

Fixed = 0x1000

для дійсних чисел (типів float, double) використовувати представлення у форматі з фіксованою крапкою, причому кількість цифр дробової частини визначається заданої за замовчуванням точністю (див. нижче перемінну x_precision);

unitbuf = 0x2000

очищати всі потоки (вивантажити вміст буферів) після кожного виведення (після включення в потік);

stdio = 0x4000

очищати потоки stdout, stderr (вивантажити вміст буферів) після кожного виведення (після включення в потік).

Таблиця 13.2 - Компонентні змінні класу ios

Int x_width

задає мінімальну ширину поля виведення

int x_precision

задає точність представлення дійсних чисел, тобто максимальна кількість цифр дробової частини при виведення;

Int x_fill

визначає символ заповнення поля виведення до мінімальної ширини, визначеної x_width. За замовчуванням x_fill має значення пробілу.

static long bitalloc ()

повертає значення може бути для установки, очищення і перевірка прапорів. Функція призначена для заданих користувачем прапорів форматування

char fill()

повертає поточний символ заповнення незайнятих (порожніх) позицій поля виведення

charFill(char)

заміняє символ заповнення значенням параметра, повертає попередній символ заповнення;

long flags();

повертаючий набір бітів прапорів форматування;

long flags(long);

установлює біти прапорів форматув. у відповідності зі знач. п-тра. Повертає попереднє значення прапорів;

Продовження таблиці 13.2 -Компонентні змінні класу ios

Int precision();

повертає поточне значення точності представлення при виведенні дійсних чисел (типу float і double)

Int precision(int n);

установлює за значенням параметра n точність представлення дійсних чисел, повертає попереднє значення точності;

long setf(long);

установлює прапори відповідно до того, як вони позначені у фактичному параметрі. Повертає попередню установку прапорів;

long setf(long _setbits, long _field) ; •'?'•

установлює прапори у відповідності зі значеннями параметрів. Біти, позначені в параметрі _field, скидаються (очищаються), а потім установлюються ті біти, що відзначені в параметрі _setbits;

long unsetf(long);

скидаються (очищаються) усі біти прапорів, що помічені в параметрі. Функція повертає попереднє значення прапорів;

Int width() ; \

повертає встановлене значення ширини поля

int width (int);

установлює значення ширини поля у відповідності зі значенням параметра xalloc;

          1. Static int хalloc()

повертає індекс масиву до тих пір поки не використованих слів, які можна використовувати в якості визначених файлів форматування