Лекція №3. Потоковi манiпулятори

Содержание

Слайд 2

Маніпулятори Маніпуляторами називаються функції, які можна включати в ланцюжок операцій приміщення

Маніпулятори
Маніпуляторами називаються функції, які можна включати в ланцюжок операцій приміщення та

вилучення для форматування даних. Маніпулятори діляться на прості, які не потребують вказівки аргументів, і параметризовані. Користуватися маніпуляторами більш зручно, ніж методами встановлення прапорів форматування
Нижче перераховані маніпулятори, які не потребують вказівки аргументів.
Слайд 3

Слайд 4

Зміни системи числення діють до наступної явної зміни. Приклад: cout Якщо

Зміни системи числення діють до наступної явної зміни.
Приклад:
cout << 13<< hex<<

' '<< 13 << oct<< ' '<< 13 << endl;
Якщо інші значення прапорів встановлені за замовчуванням, буде виведено:
13 d 15
Параметризовані маніпулятори
Нижче перераховані маніпулятори, що вимагають вказівки аргументу. Для їх використання потрібно підключити до програми заголовний файл .
Слайд 5

Слайд 6

Слайд 7

Приклад використання параметризованих маніпуляторів. Для нього наведемо приклад, який робить аналогічний

Приклад використання параметризованих маніпуляторів. Для нього наведемо приклад, який робить аналогічний

форматований вивід інформації про студентів, тільки формат виведення чисел встанови у вигляді мантиси з порядком
#include "stdafx.h"
#include
#include
using namespace std;
const int n=2;
//Створимо структуру для зберігання інформації про студентів з двома полями ПІБ та середній бал успішності
Слайд 8

struct Tstudent { char FIO[20]; float bal; }StudetnPotok[n]={"Petrov",3.5,"Sidorov",5.0/3}; int main (int

struct Tstudent
{
char FIO[20];
float bal;
}StudetnPotok[n]={"Petrov",3.5,"Sidorov",5.0/3};
int main (int argc, char * const argv[])


{
for(int i=0;i {
Слайд 9

cout cout.unsetf(ios::right); cout cout.setf(ios::left); cout cout cout cout.setf(ios::fixed); cout cout

cout<cout.unsetf(ios::right);
cout<cout.setf(ios::left);
cout<

і cout.fill('.');
cout<cout<cout.setf(ios::fixed);
cout<cout<
Слайд 10

cout cout.setf(ios::scientific); cout cout cout.width(10) cout cout.setf(ios::right); cout cout } cin.get(); return 0; }

cout< cout.setf(ios::scientific);
cout < cout< cout.width(10)
cout<

ж що і
cout.setf(ios::right);
cout< cout<}
cin.get();
return 0;
}
Слайд 11

Цей фрагмент виведе на екран наступний результат: Petrov........._3.500e+00 Sidorov........_1.667e+00 Використовуючи маніпулятори

Цей фрагмент виведе на екран наступний результат:
Petrov........._3.500e+00
Sidorov........_1.667e+00
Використовуючи маніпулятори методи можна об'єднувати.

Наступний фрагмент коду робить той же самий висновок за винятком того що змінений формат виведення чисел
#include
#include
using namespace std;
Слайд 12

const int n=2; struct Tstudent { char FIO[20]; float bal; }StudetnPotok[n]={"Petrov",3.5,"Sidorov",5.0/3};

const int n=2;
struct Tstudent
{
char FIO[20];
float bal;
}StudetnPotok[n]={"Petrov",3.5,"Sidorov",5.0/3};
int main (int argc, char *

const argv[])
{
for(int i=0;i {
cout< <
Слайд 13

cout } cin.get(); return 0; } Цей фрагмент виведе на екран наступний результат: Petrov........._______3.500 Sidorov........______1.667

cout< < }
cin.get();
return 0;
}
Цей фрагмент виведе на екран наступний результат:
Petrov........._______3.500
Sidorov........______1.667

Слайд 14

Наведемо приклад, як за допомогою прапорів, методів і маніпуляторів потоку можна

Наведемо приклад, як за допомогою прапорів, методів і маніпуляторів потоку можна

створити власну функцію для форматованого виведення спеціалізованих даних
Нехай у нас є інформація про студентів, яку необхідно виводити користувачеві в зручному вигляді
#include
#include
#include
using namespace std;
const int n=2;
Слайд 15

//Створимо структуру для зберігання інформації про студентів з двома полями ПІБ

//Створимо структуру для зберігання інформації про студентів з двома полями ПІБ

та середнім балом успішності
struct Tstudent
{
char FIO[20];
float bal;
}Stud[n]={"Petrov",3.5,"Sidorov",5.0/3};
void myOut(ostream &out,Tstudent *StudetnPotok,int n)
{
for(int i=0;i {
Слайд 16

cout cout } } int main (int argc, char * const argv[]) {

cout< < cout< < }
}
int main (int argc, char * const argv[])
{

Слайд 17

// Цей фрагмент виведе на екран наступний результат: myOut(cout,Stud,n); ofstream fileout("o.txt");

// Цей фрагмент виведе на екран наступний результат:
myOut(cout,Stud,n);
ofstream fileout("o.txt");
myOut(fileout,Stud,n);
return 0;
}
Методи обміну

з потоками
У потокових класах поряд з операціями вилучення >> і включення << визначені методи для неформатованого читання і запису в потік
Слайд 18

(при цьому перетворення даних не виконуються). Нижче наведені функції читання, визначені в класі istream.

(при цьому перетворення даних не виконуються). Нижче наведені функції читання, визначені

в класі istream.
Слайд 19

Слайд 20

Слайд 21

Слайд 22

Помилки потоків У базовому класі ios визначено поле state, яке являє

Помилки потоків
У базовому класі ios визначено поле state, яке являє собою

стан потоку у вигляді сукупності бітів:
enum io_state {
goodbit = 0x00,// Немає помилок
eofbit = 0x01,// Досягнуто кінця файлу
fail bit = 0x02,// Помилка форматування або перетворення
Слайд 23

badbit = 0x04, // Серйозна помилка, після якої // користуватися потоком

badbit = 0x04, // Серйозна помилка, після якої
// користуватися потоком неможливо
hardfail = 0x08 //

Несправність обладнання
}:
Станом потоку можна керувати за допомогою перерахованих нижче методів і операцій:
Слайд 24

Далі наведені часто використовувані операції з прапорами стану потоку. // Перевірити,

Далі наведені часто використовувані операції з прапорами стану потоку.
// Перевірити, чи

встановлений прапор flag;
if(stream_obj.rdstate() & ios::flag)
// Скинути прапор flag:
stream_obj.clear(rdstate() & ~ios::flag)