Потоци (Rev: 1.1)

Подобни документи
Входно/изходните операции са разширяеми. Лесно се реализират входно/изходни операции за типове, дефинирани от потребителя. Потоци (Rev: 1.1) Любомир Ч

Предефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически униве

Обработка на грешки Изключения Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София Re

Дефиниране на шаблон Шаблони (Templates) Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

Динамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

При изпълнението на програма се извършват определени действия над данните, дефинирани в програмата.тези данни могат да бъдат постоянни ( константи ) и

C++

Класове в C++ (Rev: 742) Любомир Чорбаджиев 1 20 октомври 2006 г. Съдържание Съдържание 1 Обектно-ориентирано програмиране 1

Както бе споменато в предходните части съществуват три основни вида алгоритми: линейни, разклонени и циклични. В тази част ще разгледаме линейните алг

В тази част, ще разгледаме аритметичните и логически операции, както, и включването им в изрази. В следващата таблица са дадени всички възможни операц

Сериализация Калин Георгиев 13 май 2016 г. Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 1 / 23

Структура на програма в C - Част 7 - масиви, оператор за индексиране, sizeof оператор

Структура на програма в C - Част 2 - типове, функции

Програмен език C Пламен Танов Ненко Табаков Мартин Вачовски Технологично училище Електронни системи Технически университет София версия 0.5

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г ноември 2018 г. Трифон Трифонов (УП 18/19) Ма

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 9 ноември 2016 г. Триф

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 ноември 6 декември 2018 г. Трифон Трифонов (УП 1

Проф

2. Наследяване в C++ Съдържание Съдържание Наследяване (Rev: 1.2) Любомир Чорбаджиев 1 1 февруари 2007 г. 1 Наследяване 1 2

Указатели. Маисиви, указатели, параметри на функции Калин Георгиев 21 декември 2016 г. Калин Георгиев Увод в програмирането 21 декември 2016 г. 1 / 23

2. Лексически анализ. Основни понятия и алгоритъм на лексическия анализ. Програмна структура на лексическия анализатор Цел на упражнението Упражнениет

Програмиране на Паскал

МИНИСТЕРСТВО НА ОБРАЗОВАНИЕТО И НАУКАТА

Структура на програма в C - Част 9 - низове от символи, C-string

Маисви

Lush Green

Лекции по Програмиране първа част I. Въведение в компютрите и програмирането КОМПЮТЪР = АПАРАТУРА + ПРОГРАМНО ОСИГУРЯВАНЕ Апаратна част Hardware(Харду

Mathematica CalcCenter

Виртуални функции

Лабораторно упражнение 6 Тема: Оператори за цикли в езика C++. Реализиране на циклични алгоритми I. Цел на лабораторното упражнение Да се затвърдят зн

4

Microsoft Word - Lection06.doc

Lush Green

Лабораторно упражнение 4 Тема : Реализиране на линейни програми.. I. Цел на лабораторното упражнение Аритметични и логически операции в програмният ез

В настоящата тема ще разгледаме представянето на числата в изчислителните устройства. Ще покажем представянето на числата в позиционните бройни систем

Динамична памет Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. Тр

Структура на програма в C - Част 6 - goto, switch, break и continue клаузи

-

Slide 1

Black and White

5

Допълнения в периода Версия Модул Документи Към Права на достъп до екземпляри документи е добавено право Изтриване на док

Пощенска Банка Формат на входни файлове за масови плащания Съдържание: 1. Общи характеристики Плащания с кредитен превод Плащания на з

Ръководство за бързо стартиране Microsoft Outlook 2013 изглежда по-различно от предишните версии и затова създадохме този справочник, за да ви помогне

Slide 1

Wolfram Mathematica & SQL

1 КаБел ЕООД Документация за софтуерния продукт КаБел ЕООД, подпомагащ организация на складовата дейност в железария Автор: Румен Ангелов История на в

Синтаксис за дефиниране на функции Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 6 януари 2016 г. Трифон Трифонов (ФП-И 15/

Управление на перална машина с размита логика Пералните машини в наши дни са обикновен уред в дома. Най-голяма изгода, която потребителя получава от п

ОСНОВИ НА ЕЗИКА С# Интеграция на езиците за програмиране Една от най-добрите черти на.net Framework е възможността за интеграция на множество езици за

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA JAVA ОБЕКТИ Ненко Табаков Пламен Танов Технологическо училище Електронни системи Технически университет София 9 октомври

Препис:

Потоци (Rev: 1.1) Любомир Чорбаджиев 1 lchorbadjiev@elsys-bg.org 1 Технологическо училище Електронни системи Технически университет, София 8 май 2007 г. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 1 / 52

Съдържание 1 Йерархия на потоците за вход/изход 2 Писане в поток 3 Четене от поток 4 Състояние на потока 5 Четене на символни низове 6 Изключения генерирани от входно/изходните операции 7 Форматиране при изходни операции 8 Манипулатори 9 Файлови потоци Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 2 / 52

Въведение Йерархия на потоците за вход/изход Входно/изходните потоци в C++ са обектно ориентирани. Входно/изходните операции в C++ са строго типизирани. Това позволява при обработването на данни с различен тип да се използва C++ механизмът за предефиниране на оператори и функции. Входно/изходните операции са разширяеми. Лесно се реализират входно/изходни операции за типове, дефинирани от потребителя. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 3 / 52

Йерархия на потоците за вход/изход Йерархия на потоците за вход/изход Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 4 / 52

Йерархия на потоците за вход/изход Йерархия на потоците за вход/изход Потоците за вход/изход са организирани като йерархия от шаблонни класове. Потоците, които се използват обичайно са: ostream, istream, ofstream, ifstream. Тези потоци са 8 битови т.е. последователността от символи, които се четат/пишат са от типа char. Дефинициите на тези потоци са следните: t y p e d e f basic_ostream < char > ostream ; t y p e d e f basic_istream < char > istream ; t y p e d e f basic_ofstream < char > ofstream ; t y p e d e f basic_ifstream < char > ifstream ; t y p e d e f basic_fstream < char > fstream ; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 5 / 52

Йерархия на потоците за вход/изход Йерархия на потоците за вход/изход В езика C++ освен типа char (8 битов символ) е дефиниран и типа wchar_t (16 битов символ); Потоците, които работят с типа wchar_t са: t y p e d e f basic_ostream <wchar_t > wostream ; t y p e d e f basic_istream <wchar_t > wistream ; t y p e d e f basic_ofstream <wchar_t > wofstream ; t y p e d e f basic_ifstream <wchar_t > wifstream ; t y p e d e f basic_fstream <wchar_t > wfstream ; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 6 / 52

Йерархия на потоците за вход/изход Работа с потоците за вход/изход Всички потоци за вход/изход са дефинирани в пространството от имена std. Основните потоци са дефинирани в заглавния файл <iostream>. В него са дефинирани обектите: cin обект от класа istream, който е свързан със стандартния вход. cout обект от класа ostream, който е свързан със стандартния изход. cerr обект от класа ostream, който е свързан със стандартната грешка. Този поток е небуфериран. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 7 / 52

Писане в поток Писане в поток За писане в изходен поток се използва операторът operator<<. В класа basic_ostream този оператор е дефиниран за всички примитивни типове: 1 template < c l a s s Ch, c l a s s Tr= char_traits <Ch > > 2 c l a s s basic_ostream : 3 v i r t u a l p u b l i c basic_ios <Ch, Tr > { 4 p u b l i c : 5 //... 6 basic_ostream & operator < <( s h o r t n); 7 basic_ostream & operator < <( i n t n); 8 basic_ostream & operator < <( long n); 9 basic_ostream & operator < <( unsigned s h o r t n); 10 //... 11 }; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 8 / 52

Писане в поток Писане в поток Операторът operator<< връща псевдоним, насочен към използвания изходен поток ostream. Това дава възможност операторът за изход да се прилага каскадно. Изразът: cout << "x=" << x; е еквивалентен на: ( cout. operator < <("x=" )). operator < <(x); Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 9 / 52

Писане в поток Операции за изход, дефинирани от потребителя Да разгледаме клас point, определен от потребителя: 1 c l a s s point { 2 double x_, y_; 3 p u b l i c : 4 point ( double x, double y) 5 : x_(x), y_(y) 6 {} 7 double get_x ( v o i d ) { r e t u r n x_ ;} 8 double get_y ( v o i d ) { r e t u r n y_ ;} 9 v o i d set_x ( double x ) { x_=x;} 10 v o i d set_y ( double y ) { y_=y;} 11 //... 12 }; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 10 / 52

Писане в поток Операции за изход, дефинирани от потребителя Операторът operator<< за този тип може да бъде дефиниран по следния начин: 1 ostream & operator < <( ostream & out, 2 const point & p ) { 3 out << ( 4 << p. get_x () < <, 5 << p. get_y () < < ) ; 6 r e t u r n out ; 7 } Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 11 / 52

Четене от поток Четене от поток За четене от входен поток се използва операторът operator>>. В класа basic_istream този оператор е дефиниран за всички примитивни типове: 1 template < c l a s s Ch, c l a s s Tr= char_traits <Ch > > 2 c l a s s basic_istream : 3 v i r t u a l p u b l i c basic_ios <Ch, Tr > { 4 p u b l i c : 5 //... 6 basic_istream & operator > >( s h o r t & n); 7 basic_istream & operator > >( i n t & n); 8 basic_istream & operator > >( long & n); 9 //... 10 }; Операторът operator>> пропуска символите разделители (, \n, \r, \t, \f, \v ). Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 12 / 52

Състояние на потока Състояние на потока Най-разпространената грешка при използване на потоци за вход istream: това, което е в потока се различава от това, което очакваме да бъде в потока. Например: искаме да прочетем променлива от типа int, а в потока има букви. За да се предпазим от този тип грешки е необходимо преди да се използват прочетените от потока данни да се провери състоянието на потока. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 13 / 52

Състояние на потока Състояние на потока Всеки поток istream и ostream има свързано с него състояние. Състоянието на потока е дефинирано в базовия клас basic_ios<>. 1 template < c l a s s Ch, c l a s s Tr= char_traits <Ch > > 2 c l a s s basic_ios : p u b l i c ios_base { 3 p u b l i c : 4 //... 5 bool good ( v o i d ) const ; 6 bool eof ( v o i d ) const ; 7 bool fail ( v o i d ) const ; 8 bool bad ( v o i d ) const ; 9 //... 10 }; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 14 / 52

Състояние на потока Състояние на потока good() предходните операции са изпълнени успешно; eof() вижда се краят на файла; fail() следващата операция няма да се изпълни успешно; bad() потокът е повреден. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 15 / 52

Състояние на потока Състояние на потока Състоянието на потока представлява набор от флагове, които са дефинирани в базовия клас ios_base: 1 c l a s s ios_base { 2 p u b l i c : 3 //... 4 t y p e d e f... iostate ; 5 s t a t i c const iostate 6 badbit, // потокът е развален 7 eofbit, // вижда се краят на файла 8 failbit,// следващата операция няма да се изпълни 9 goodbit ;// потокът е наред 10 //... 11 }; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 16 / 52

Състояние на потока Състояние на потока В класа basic_ios<> са дефинирани следните методи за манипулиране на състоянието на потока: 1 template < c l a s s Ch, c l a s s Tr= char_traits <Ch > > 2 c l a s s basic_ios : p u b l i c ios_base { 3 p u b l i c : 4... 5 // връща флаговете на състоянието на потока 6 iostate rdstate ( v o i d ) const ; 7 // установява флаговете на състоянието 8 v o i d clear ( iostate f= goodbit ); 9 // добавя f към флаговете на състоянието 10 v o i d setstate ( iostate f ) { 11 clear ( rdstate () f); 12 } 13 }; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 17 / 52

Състояние на потока Състояние на потока 1 template < c l a s s Ch, c l a s s Tr= char_traits <Ch > > 2 c l a s s basic_ios : p u b l i c ios_base { 3 p u b l i c : 4... 5 o p e r a t o r v o i d * () const ; 6 }; Операторът, дефиниран в ред 5, е оператор за преобразуване към void*. Този оператор връща стойност, различна от NULL, ако потокът е наред. Този оператор за преобразуване позволява потоците да участват в условни оператори и оператори за цикъл. Например: w h i l e ( cin ){ cin >> i; } Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 18 / 52

Състояние на потока Операции за вход, дефинирани от потребителя Нека формата за въвеждане на променливи от типа point е (x,y), където x и y са числа с плаваща точка. Тогава дефиницията на оператор за четене на обекти от класа point може да бъде направена по следния начин: 1 istream & operator > >( istream & in, point & p ) { 2 double x,y; 3 char c; 4 in >> c; 5 i f (c!= ( ) { 6 in. clear ( ios_base :: badbit ); 7 r e t u r n in; 8 } 9 in >> x >> c; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 19 / 52

Състояние на потока Операции за вход, дефинирани от потребителя 10 i f (c!=, ) { 11 in. clear ( ios_base :: badbit ); 12 r e t u r n in; 13 } 14 in >> y >> c; 15 i f (c!= ) ) { 16 in. clear ( ios_base :: badbit ); 17 r e t u r n in; 18 } 19 i f (in. good ()){ 20 p. set_x (x); 21 p. set_y (y); 22 } 23 r e t u r n in; 24 }; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 20 / 52

Четене на символни низове Четене на символи Операторът operator>> е предназначен за форматиран вход т.е. за четене на обекти от някакъв очакван тип, в някакъв очакван формат. Когато предварително не се знае какви типове ще има във входния поток, то от входния поток обикновено се четат символни низове. За тази цел се използва семейството от методи get(), дефинирани в basic_istream<>. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 21 / 52

Четене на символни низове Четене на символи char c; cin. get (c); char buf [100]; cin. get (buf,100); cin. get (buf,100, \n ); cin. getline (buf,100); cin. getline (buf,100, \n ); Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 22 / 52

Четене на символни низове Четене на символи Функциите in.get(buf,n) и in.get(buf,n,term) прочитат не повече от n 1 символа. Тези методи винаги поставят 0 след прочетените в буфера символи. Ако при четене с get е срещнат завършващият символ, то той остава в потока. Следващият фрагмент е пример за хитър безкраен цикъл: 1 char buf [256]; 2 w h i l e ( cin ) { 3 cin. get (buf,256); 4 cout < < buf ; 5 } Функцията getline() се държи аналогично на get(), но прочита от istream срещнатия завършващ символ. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 23 / 52

Четене на символни низове Четене на символи in.ignore(max,term) пропуска следващите символи докато не срещне символа term или не прочете max символа. in.putback(ch) превръща ch в следващия непрочетен символ от потока in. in.peek() връща следващия символ от потока in, но не го изтрива от потока. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 24 / 52

Изключения генерирани от входно/изходните операции Изключения Да се проверява за грешки след всяка входно/изходна операция е неудобно. Поради това е предвидена възможност да помолите потока да генерира изключения, когато се променя състоянието му. В базовия клас basic_ios<> са дефинирани две функции: void exceptions(iostate st) установява състоянията, при които трябва да се генерира изключение. iostate exceptions() const връща набора от флагове на състоянието, при които се генерира изключение. Основната роля на генерирането на изключения при вход/изход е да се обработват малко вероятни изключителни ситуации. Изключенията могат да се използват и за контролиране на входно-изходните операции. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 25 / 52

Изключения генерирани от входно/изходните операции Пример: изключения 1 #i n c l u d e < iostream > 2 #i n c l u d e <list > 3 4 u s i n g namespace std ; 5 6 i n t 7 main ( i n t argc, char * argv []) { 8 list < i n t > result ; 9 ios_ base :: iostate oldstate = cin. exceptions (); 10 cin. exceptions ( ios_base :: eofbit 11 ios_base :: badbit 12 ios_base :: failbit ); Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 26 / 52

Изключения генерирани от входно/изходните операции Пример: изключения 14 t r y { 15 f o r (;;){ 16 i n t i; 17 cin >> i; 18 result. push_back (i); 19 } 20 } catch ( const ios_base :: failure & e ) { 21 cout <<" ios_base :: failure catched... " << endl ; 22 } 23 24 r e t u r n 0; 25 } Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 27 / 52

Форматиране Форматиране при изходни операции Форматирането на входно/изходните операции се контролира чрез класовете basic_ios и ios_base. За управление на форматирането на входно/изходните операции се използва набор от флагове, определени в ios_base. Част от флаговете, определящи състоянието на формата са представени в следния фрагмент: Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 28 / 52

Форматиране Форматиране при изходни операции 1 c l a s s ios_base { 2 p u b l i c : 3 t y p e d e f implementation_dependent fmtflags ; 4 s t a t i c const fmtflags 5 skipws, // пропуска разделителите при четене 6 boolalpha, // типа boolean се представят 7 // като true и false 8 // целочислени типове 9 dec, // десетична система 10 hex, // шестнадесетична система 11 oct, // осмично система 12 showbase, // поставя префикс, 13 // обозначаващ системата Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 29 / 52

Форматиране Форматиране при изходни операции 1 // числа с плаваща запетая 2 scientific,// представяне във вида: d.dddddeddd 3 fixed, // представяне във вида: ddddd.dd 4 showpoint, // незначеща нула пред десетичната точка 5 showpos, // явен знак + пред положителните числа 6...; 7 }; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 30 / 52

Форматиране при изходни операции Състояние на формата skipws boolalpha dec hex oct showbase scientific fixed showpoint showpos пропускане на разделителните символи представяне на типа boolean целочислени типове в каква бройна система да се извеждат представяне на бройната система как се извеждат типовете с плаваща точка Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 31 / 52

Форматиране Форматиране при изходни операции За манипулиране на състоянието на формата, в класа ios_base са дефинирани следните методи: 1 c l a s s ios_base { 2 p u b l i c : 3... 4 fmtflags flags () const ; 5 fmtflags flags ( fmtflags f); 6 fmtflags setf ( fmtflags f){ 7 r e t u r n flags ( flags () f); 8 } Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 32 / 52

Форматиране Форматиране при изходни операции 1 fmtflags setf ( fmtflags f, fmtflags mask ) { 2 r e t u r n flags (( flags ()&~ mask ) ( f& mask )); 3 } 4 v o i d unset ( fmtflags mask ) { 5 flags ( flags ()&~ mask ); 6 } 7 }; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 33 / 52

Форматиране Форматиране при изходни операции Стандартната схема за работа с флаговете за форматиране е следната: запомняме състоянието на формата; променяме състоянието на формата и използваме потока; възстановяваме предишното състояние на потока. 1 v o i d foo ( v o i d ) { 2 ios_base :: fmtflags old_flags = cout. flags (); 3 cout. setf ( ios_base :: oct ); 4... 5 cout. flags ( old_flags ); 6 }; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 34 / 52

Форматиране при изходни операции Извеждане на цели числа Добавянето на флагове чрез метода setf() или чрез побитово ИЛИ ( ) е удобно, само когато дадена характеристика на потока се управлява от един бит. Тази схема е неудобна в случаи като определяне на бройната система. В такива случаи състоянието на формата не се определя от един бит. Решението на този проблем, което се използва в <iostream>, е да се предостави версия на setf() с втори псевдо-аргумент : cout. setf ( ios_base :: oct, ios_base :: basefield ); cout. setf ( ios_base :: dec, ios_base :: basefield ); cout. setf ( ios_base :: hex, ios_base :: basefield ); Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 35 / 52

Форматиране при изходни операции Извеждане на цели числа: пример 1 #i n c l u d e < iostream > 2 u s i n g namespace std ; 3 4 i n t main ( i n t argc, char * argv []) { 5 cout. setf ( ios_base :: showbase ); 6 cout. setf ( ios_base :: oct, ios_base :: basefield ); 7 cout < < 1234 < < < < 1234 < < endl ; 8 cout. setf ( ios_base :: dec, ios_base :: basefield ); 9 cout < < 1234 < < < < 1234 < < endl ; 10 cout. setf ( ios_base :: hex, ios_base :: basefield ); 11 cout < < 1234 < < < < 1234 < < endl ; 12 13 r e t u r n 0; 14 }; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 36 / 52

Форматиране при изходни операции Извеждане на цели числа: пример 02322 02322 1234 1234 0x4d2 0x4d2 Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 37 / 52

Форматиране при изходни операции Извеждане на числа с плаваща точка Извеждането на числа с плаваща запетая се определя от формата и точността. Форматите, които се използват за извеждане на числа с плаваща запетая са: Универсален позволява на потока сам да реши в какъв вид да се представи извежданото число. По подразбиране потоците използват този формат. Научен представя числото като десетична дроб с една цифра преди десетичната точка и показател на степента. Фиксиран точността определя максималният брой цифри след десетичната точка. По подразбиране точността е 6 цифри. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 38 / 52

Форматиране при изходни операции Извеждане на числа с плаваща точка: пример 1 #i n c l u d e < iostream > 2 u s i n g namespace std ; 3 i n t main ( i n t argc, char * argv []) { 4 cout < <1234.56789 < < < <1234.5678901 < < endl ; 5 cout. setf ( ios_base :: scientific, 6 ios_ base :: floatfield ); 7 cout < <1234.56789 < < < <1234.5678901 < < endl ; 8 cout. setf ( ios_base :: fixed, 9 ios_ base :: floatfield ); 10 cout < <1234.56789 < < < <1234.5678901 < < endl ; 11 cout. setf ( s t a t i c _ c a s t < ios_base :: fmtflags >(0), 12 ios_ base :: floatfield ); 13 cout < <1234.56789 < < < <1234.5678901 < < endl ; 14 r e t u r n 0; 15 } Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 39 / 52

Форматиране при изходни операции Извеждане на числа с плаваща точка: пример 1234.57 1234.57 1.234568e+03 1.234568e+03 1234.567890 1234.567890 1234.57 1234.57 Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 40 / 52

Форматиране при изходни операции Извеждане на числа с плаваща точка За промяна на точността на работа с числа с плаваща запетая се използват следните методи: c l a s s ios_base { p u b l i c :... unsigned precision () const ; unsigned precision ( unsigned n);... }; Използването на precision() влияе на всички входно/изходни операции с потока и действа до следващото използване на метода. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 41 / 52

Форматиране при изходни операции Извеждане на числа с плаваща точка: пример 1 #i n c l u d e < iostream > 2 u s i n g namespace std ; 3 i n t main ( i n t argc, char * argv []) { 4 cout. precision (12); 5 cout < <123456789 < < < <1234.12345 < < 6 < <1234.123456789 < < endl ; 7 cout. precision (9); 8 cout < <123456789 < < < <1234.12345 < < 9 < <1234.123456789 < < endl ; 10 cout. precision (4); 11 cout < <123456789 < < < <1234.12345 < < 12 < <1234.123456789 < < endl ; 13 r e t u r n 0; 14 } Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 42 / 52

Форматиране при изходни операции Извеждане на числа с плаваща точка: пример 123456789 1234.12345 1234.12345679 123456789 1234.12345 1234.12346 123456789 1234 1234 Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 43 / 52

Форматиране при изходни операции Полета за изход 1 #i n c l u d e < iostream > 2 u s i n g namespace std ; 3 i n t main ( i n t argc, char * argv []) { 4 cout << ( ; 5 cout. width (5); 6 cout < < 12 < < ) << endl ;; 7 cout << ( ; 8 cout. width (5); cout. fill ( # ); 9 cout < < 12 < < ) << endl ;; 10 cout << ( ; 11 cout. width (5); cout. fill ( # ); 12 cout << "a" << ) << endl ;; 13 cout << ( ; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 44 / 52

Форматиране при изходни операции Полета за изход 14 cout. width (0); cout. fill ( # ); 15 cout << "a" << ) << endl ;; 16 r e t u r n 0; 17 } ( 12) (###12) (####a) (a) Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 45 / 52

Манипулатори Манипулатори Да се променя състоянието на потока посредством флаговете на формата е неудобно. Стандартната библиотека предоставя набор от функции и обекти за манипулиране на състоянието на потока манипулатори. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 46 / 52

Манипулатори Манипулатори Основният начин за използване на манипулатори може да се види от следния пример: cout << boolalpha << true << << noboolalpha << t r u e ; което извежда: true 1. Използват се и манипулатори с аргументи: cout < < setprecision (10) < < 1234. 12345678 < < endl ; което извежда: 1234.123457. Манипулаторите с аргументи са дефинирани в <iomanip>. Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 47 / 52

Манипулатори boolalpha noboolalpha представяне на типа boolean showbase noshowbase представяне на бройната система showpoint noshowpoint showpos noshowpos skipws noskipws пропускане на разделителните символи dec целочислени типове в каква hex бройна система да се извеждат oct fixed как се извеждат типовете scientific с плаваща точка setprecision(n) точност на извеждането setw(int n) ширина на полето за извеждане setfill(int c) символ за запълване на полето Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 48 / 52

Файлови потоци Файлови потоци Потоците за работа с файлове са дефинирани в <fstream>. Потокът за писане във файл е basic_ofstream. template < c l a s s Ch, c l a s s Tr= char_traits <Ch > > c l a s s basic_ofstream : p u b l i c basic_ostream <Ch,Tr > { p u b l i c : e x p l i c i t basic_ofstream ( const char * p, openmode m= out trunc ); bool is_open () const ; v o i d open ( const char * p, openmode m= out trunc ); v o i d close ();... }; Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 49 / 52

Файлови потоци Файлови потоци c l a s s ios_base { p u b l i c : t y p e d e f implementation_dependent1 openmode ; s t a t i c const openmode app, ate, binary, in, out, trunc ;... }; in out app ate trunc отваряне за четене отваряне за запис запис на данните в края на файла; предизвиква отваряне на файла в режим out запис на данните в края на файла унищожава предишното съдържание на файла Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 50 / 52

Файлови потоци Файлови потоци 1 #i n c l u d e < iostream > 2 #i n c l u d e < fstream > 3 #i n c l u d e < cstdlib > 4 v o i d error ( const char * p, const char * p2="" ) { 5 std :: cerr << p << << p2 << std :: endl ; 6 std :: exit (1); 7 } Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 51 / 52

Файлови потоци 8 i n t main ( i n t argc, char * argv []) { 9 i f ( argc!=3) 10 error (" bad number of arguments... "); 11 std :: ifstream from ( argv [1]); 12 i f (! from ) 13 error (" bad input file ", argv [1]); 14 std :: ofstream to( argv [2]); 15 i f (! to) 16 error (" bad output file :", argv [2]); 17 char ch; 18 w h i l e ( from. get (ch )) 19 to.put (ch ); 20 i f (! from. eof ()! to) 21 error (" something strange... "); 22 r e t u r n 0; 23 } Л. Чорбаджиев (ELSYS) Потоци (Rev: 1.1) 8 май 2007 г. 52 / 52