Programmer’s Reference


ГЛАВА 12 – Системата на С++ за I/O в стар стил



страница12/19
Дата21.09.2016
Размер2.35 Mb.
#10416
1   ...   8   9   10   11   12   13   14   15   ...   19

ГЛАВА 12 – Системата на С++ за I/O в стар стил

Понеже С++ включва цялата библиотека на С , се поддържа и системата за

I/O на С . Обаче С++ също дефинира собствена класово – базирана , обектно – ориентирана I/O система която е позната като библиотеката iostream . Когато пишете С++ програми обикновенно ще искате да използвате по – скоро библиотеката iostream отколкото С – базирания I/O . По време на писането на това съществуват две версии на входно – изходната библиотека в употреба : една стара базирана на оригиналните спецификации на С++ и една по – нова дефинирана от стандартизационния комитет ANSI C++ . Днес повечето С++ компилатори поддържат и двете I/O библиотеки . И за щастие , повечето неща и в двете работят по един начин . Ако знете как да използвате едната , ще можете лесно да използвате и другата . Обаче има няколко важни разлики между двете . Първоначално оригиналните iostream класове бяха дефинирани в глобалното именовано пространство . Новата стандартна библиотека се съдържа в именованото пространство std . Второ , новата I/O библиотека е дефинирана чрез използване на цялостно , взаимносвързано множество от шаблонни класове и функции . Библиотеката в стар стил използва не – сложна , нешаблонизирана класова йерархия . За щастие , имената на класовете които ще използвате във вашите програми остават същите . Трето , новата I/O библиотека дефинира много нови типове данни . Четвърто , за използване на старата библиотека ще трябва да включите хедърните файлове такива като IOSTREAM.H . Тези хедърни файлове дефинират класовете в стар стил за I/O и ги слагат в глобалното именовано пространство . За сравнение за да използвате новата I/O стандартна библиотека включете хедъра в нов стил

< iostream > във вашата програма . Поради разликите между новия и стария стил I/O библиотеки те ще бъдат описани отделно в този справочник . Тази секция описва библиотеката в стар стил . Следващата глава описва новата стандартна I/O библиотека .

Основни класове за потоци


Библиотеката за I/O в стар стил използва хедър файла IOSTREAM.H . Този файл дефинира основната класова йерархия която поддържа I/O операции . Ако ще извършвате файлов I/O ще трябва да включите FSTREAM.H . За да използвате базиран на масиви I/O ще трябва да включите STRSTREAM.H . Класът от най – ниско ниво е наречен streambuf . Tози клас доставя основните входно – изходни операции . Той се използва главно за базов клас на други класове . Освен ако не правите ваши собствени I/O класове няма да използвате директно streambuf . Класа ios е базов клас на класовата йерархия която обикновенно ще използвате когато използвате системата за I/O на С++ . Той доставя форматиране , проверка за грешки и информация за състоянието . От ios са производни различни класове – понякога през междинни класове . Класовете производни пряко или непряко от ios които обикновенно ще използвате са изброени тук :

Клас Цел

istream Общ вход



ostream Общ изход

iostream Общ вход / изход

ifstream Файлов вход

ofstream Файлов изход

fstream Файлов вход / изход



istrstream Базиран на масиви вход

ostrstream Базиран на масиви изход

strstream Базиран на масиви вход / изход

Предефинирани потоци в С++


Когато започне изпълнение на програма на С++ се отварят автоматично четири вградени потока , изброени тук :

Поток значение устройство по подразбиране cin Стандартен вход клавиатура cout Стандартен изход екран

cerr Стандартен изход за

грешки екран



clog Буферирана версия

на cerr екран

По подразбиране , стандартните потоци се използват да комуникират с конзолата . Обаче в среди които поддържат пренасочване на I/O ( като DOS , UNIX или Windows ) стандартните потоци могат да бъдат пренасочени към други устройства или файлове .

Форматни флагове


В системата за I/O на С++ всеки поток се свързва със множество от форматни флагове които контролират начина на форматиране на информацията в потока . В ios са дефнирани следните изброими стойности . Тези стойности се използват да установят или свалят форматните флагове :

adjustfield hex scientific stdio basefield internal showbase unitbuf dec left showpoint uppercase



fixed oct showpos

floatfield right skipws

Понеже тези флагове са дефинирани в класа ios , ще трябва изрично да ги определите когато ги използвате в програма . Например за обръщане към left , ще трябва да напишете ios : : left . Когато е вдигнат флага skipws водещите празни символи ( интервали , табулации и нови редове ) се отхвърлят когато изпълнявате вход в потока . Когато skipws е свален празните символи не се отхвърлят . Когато флага left е вдигнат , изхода е ляво – подравнен . Когато right е вдигнат изхода е дясно – подравнен . Когато internal е вдигнат числовата стойност се допълва до запълване на полето със вмъкнати интервали между всеки знак или базов символ . Ако никой от тези флагове не е вдигнат изхода е дясно подравнен по – подразбиране . По подразбиране числовите стойности се извеждат със десетични числа . Обаче е възможно да променим числовата основа . Вдигането на флага oct предизвиква изхода да бъде показван в осмични числа . Вдигането на hex предизвиква изхода да бъде показван в шестнайсетични числа . За връщане на изхода към десетични числа , вдигнете флага dec . Вдигането на showbase води до показване на основата на числовите стойности . Например ако основата е шестнайсетична , стойността 1F ще бъде показана като 0x1F . По подразбиране когато е показано научно означение “ е “ е малка буква . Също когато е показана шестнайсетична стойност “ х “ е малка буква . Когато е вдигнат uppercase тези символи се показват със главни букви . Вдигането на флага showpos предизвиква водещия знак плюс да бъде показван пред положителните стойности . Вдигането на showpoint предизвиква десетичната точка и следващите я нули да бъдат показвани за целия изход със плаваща точка – когато трябва или не . Чрез вдигане на scientific числата с плаваща точка се показват със научно означение Когато е вдигнат fixed , стойностите с плаваща точка се показват чрез използване на обикновенно означение . Когато никой от тези флагове не е вдигнат компилатора избира подходящия начин за показване . Когато unitbuf е вдигнат , буфера се записва след всяка операция за въвеждане . Когато е вдигнат stdio , stdout и stderr се записват след всяко извеждане . Когато е общо обръщането към oct , dec и hex полетата , те могат едновременно да се вдигнат чрез ios : : basefield . Също така полетата left , right и internal могат да бъдат реферирани като ios : : adjustfield . Накрая полетата scientific и fixed могат да бъдат представени като ios : : floatfield . Форматните флагове се обикновенно съхраняват в long integer и могат да бъдат вдигани от различни функции на класа ios .

I/O Манипулатори


В добавка към вдигането и свалянето на форматните флагове директно , има и друг начин да променим форматиращите параметри на потока . Този начин е чрез употреба на специални функции наречени манипулатори които маогат да бъдат включени в израза за I/O . Манипулаторите дефинирани от старата I/O библиотека са показани в следващата таблица :

Манипулатор Предназначение Вход / изход dec Използва десетични Вход / изход

цели числа



endl Извежда симол нов ред Изход

и записва потока



ends Извежда 0 Изход

flush Записва поток Изход

hex Използва шестнайсетични Вход / изход

цели числа


oct Използва осмични Вход / изход

цели числа


resetiosflags ( long f ) Сваля флаговете Вход / изход

определени в f



setbase ( int base ) Установява числовата Изход

основа на base



setfill ( int ch ) Установява запълващия Изход

символ на ch



setiosflags ( long f ) Вдига флаговете Вход / изход

определени в f


setprecision ( int p ) Установява броя цифри Изход

за точността



setw ( int w ) Установява ширината на Изход

полето на w



ws Прескача водещия празен Вход

интервал


За да получите достъп до манипулаторите приемащи параметри , такива като setw ( ) ще трябва да включите IOMANIP.H във вашата програма .

Програмен съвет

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

ostream &manip – name ( ostream &stream ) ;

{

// вашия код е тук

return stream ;

}

Тук manip – name е името на манипулатора . Забележете че се връща псевдоним на поток от тип ostream . Това е необходимо ако манипулатора се използва като част от по – голям I/O израз . Важно е да разберете че дори макар че манипулатора има като единствен аргумент псевдоним към потока върху който въздейства не се използва никакъв аргумент когато манипулатора е включен в изходна операция . Всички входни манипулатори без параметри имат тази структура :

istream &manip – name ( istream &stream ) ;

{

// вашия код е тук

return stream ;

}

Входния манипулатор получава псевдоним за потока за който е бил извикан . Този поток трябва да бъде върнат от манипулатора . Тук е пример за прост изходен манипулатор наречен setup ( ) . Той извършва ляво подравняване , установява ширината на полето на 10 и определя знака за долар ( $ ) като запълващ символ .



# include < iostream . h >

# include < iomanip . h >

ostream &setup ( ostream &stream ) ;

{

stream . setf ( ios : : left ) ;

stream << setw ( 10 ) << setfill ( ‘$’ ) ;

return stream ;

}

int main ( )

{

cout << 10 << “ “ << setup << 10 ;

return 0 ;

}

Запомнете : решаващо е вашия манипулатор да връща stream . Ако това не е така , вашия манипулатор няма да може да се използва в серия от входни или изходни операции .


Iostream функции в стар стил


Най – често използваните iostream функции в стар стил са описани тук :

bad ( )


# include < iostream . h >

int bad ( ) const ;

Функцията bad ( ) е член на ios . Функцията bad ( ) връща ненула ако е станала фатална I/O грешка в свързания поток , в противен случай се връща 0 . Свързана функция е good ( ) .


clear ( )


# include < iostream . h >

void clear ( int flags = 0 ) ;

Функцията clear ( ) е член на ios . Функцията clear ( ) изчиства флаговете за състоянието свързани с поток . Ако flags е 0 ( както е по – подразбиране ) тогава всички флагове за грешки се изчистват ( установяват се на 0 ) . В противен случай флаговете ще бъдат установени на стойността на flags . Свързана функция е rdstate ( ) .


eatwhite ( )


# include < iostream . h >

void eatwhite ( ) ;

Функцията eatwhite ( ) е член на istream . Функцията eatwhite ( ) чете и отхвърля всички водещи празни интервали от свързания входен поток и премества get указателя на първия не – празен символ . Свързана функция е ignore ( ) .


eof ( )


# include < iostream . h >

int eof ( ) const ;

Функцията eof ( ) е член на ios . Функцията еof ( ) връща ненула когато е достигнат края на свързания входен файл , в противен случай се връща 0 . Свързани функции са bad ( ) , fail ( ) , good ( ) , rdstate ( ) и clear ( ) .


fail ( )


# include < iostream . h >

int fail ( ) const ;

Функцията fail ( ) е член на ios . Функцията fail ( ) връща ненула ако стане грешка във свързания поток , в противен случай връща 0 . Свързани функции са good ( ) , eof ( ) , bad ( ) , clear ( ) и rdstate ( ) .


fill ( )


# include < iostream . h >

char fill ( ) const ;

char fill ( char ch ) ;

Функцията fill ( ) е член на ios . По подразбиране когато трябва да бъде запълнено поле , то се запълва със интервали . Обаче можете да промените запълващия символ чрез използване на функцията fill ( ) и определяйки новия запълващ символ в ch . Функцията ще върне стария запълващ символ . За да получите текущия запълващ символ , използвайте първата форма на fill ( ) , която връща текущия запълващ символ . Свързани функции са precision ( ) и



width ( ) .

flags ( )


# include < iostream . h >

long flags ( ) const ;

long flags ( long f ) ;

Функцията flags ( ) е член на ios . Първата форма на flags ( ) просто връща текущите форматни настройки на флаговете в свързания поток . Втората форма на flags ( ) установява всички форматни флагове свързани с поток чрез f . Тази версия също връща предишните настройки . Свързани функции са unsetf ( ) и



setf ( ) .

flush ( )


# include < iostream . h >

ostream &flush ( ) ;

Функцията flush ( ) е член на ostream . Функцията flush ( ) предизвиква буфера свързан към определения изходен поток да бъде физически записан на диска . Функцията връща псевдоним към свързания със нея поток . Свързани функции са put ( ) и write ( ) .


fstream ( ) , ifstream ( ) и ofstream ( )


# include < fstream . h >

fstream ( ) ;

fstream ( const char *filename , int mode ,

int access = filebuf : : openprot ) ;

fstream ( int fd ) ;

fstream ( int fd , char *buf , int size ) ;

ifstream ( ) ;

ifstream ( const char *filename , int mode = ios : : in ,

int access = filebuf : : openprot ) ;

ifstream ( int fd ) ;

ifstream ( int fd , char *buf , int size )

ofstream ( ) ;

ofstream ( const char *filename , int mode = ios : : out ,

int access = filebuf : : openprot ) ;

ofstream ( int fd ) ;

ofstream ( int fd , char *buf , int size )

fstream ( ) , ifstream ( ) и ofstream ( ) са конструкторите съответно на класовете fstream , ifstream и ofstream . Версиите без параметри на fstream ( ) , ifstream ( ) и оfstream ( ) създават поток който не е свързан със никакъв файл . Този поток може да бъде свързан към файл чрез използване на open ( ) . Версиите на fstream ( ) , ifstream ( ) и оfstream ( ) които приемат име на файл като първи параметър са най – често използвани в приложните програми . Въпреки че те са изцяло предназначени да отварят файл чрез използване на функцията

open ( ) , в повечето случай няма да го правите понеже тези fstream ( ) ,

ifstream ( ) и ofstream ( ) функции – конструктори автоматично отварят файла когато потока е създаден . Функциите конструктори имат еднакви параметри и действие като функцията open ( ) ( Виж open ( ) за детайли ) . По тази причина най – общия начин за отваряне на файл е този пример :

ifstream mystream ( “ myfile “ ) ;

Ако по някаква причина файла на може да бъде отворен , стойността на променливата на свързания поток ще бъде 0 . По тази причина и при използване на функция конструктор и при изрично определяне извикване на open ( ) , ще трябва да се уверите че файла действително е бил отворен чрез проверка стойността на потока . Версиите на fstream ( ) , ifstream ( ) и оfstream ( ) които приемат само един параметър , винаги валиден файлов описател , създават поток и тогава свързват този поток със файловия описател определен от fd . Версиите на fstream ( ) , ifstream ( ) и оfstream ( ) които приемат файлов описател , указател към буфер и размер , създават поток и го свързват със файловия описател определен от fd . buf трябва да бъде указател към памет която ще служи като буфер , а size определя дължината на буфера в байтове ( ако buf е 0 и/или size е 0 , няма буфериране ) . Свързани функции са close ( ) и open ( ) .

gcount ( )


# include < iostream . h >

int gcount ( ) const ;

Функцията gcount ( ) е член на istream . Функцията gcount ( ) връща броя на прочетените символи при последната входна операция . Свързани функции са get ( ) , getline ( ) и read ( ) .


get ( )


# include < iostream . h >

int get ( ) ;

istream &get ( char &ch ) ;

istream &get ( char *buf , int num , char delim = ‘ \n ‘ ) ;

istream &get ( streambuf &buf , char delim = ‘ \n ‘ ) ;

Функцията get ( ) е член на istream . Най – общо get ( ) чете символи от входния поток . Формата без параметри на get ( ) чете единствен символ от свързания поток и връща неговата стойност . Формата на get ( ) която приема един псевдоним на символ , чете символ от свързания поток и слага стойността му в ch . Тя връща псевдоним за потока ( забележете че ch може също да бъде от тип unsigned char * или signed char * ) . Формата на get ( ) която приема три параметъра чете символи в масива указван от buf докато или бъдат прочетени num символа или се срещне символа определен от delim . Масива указван от buf ще бъде нулево – терминиран от get ( ) . Ако няма определен параметър delim по – подразбиране символа за нов ред действа като разграничител . Ако се срещне разграничителния символ във входния поток , той не се извлича . Вместо това той остава в потока до следващата водна операция . Тази функция връща псевдоним за потока ( забележете че buf може също да бъде от тип unsigned char * или signed char * ) . Формата на get ( ) която приема два параметъра чете символи от входния поток в streambuf ( или производен ) обект . Символите се четат докато не се срещне определения разграничител . Тя връща псевдоним за потока . Свързани функции са put ( ) , read ( ) и getline ( )


getline ( )


# include < iostream . h >

istream &getline ( char *buf , int num , char delim = ‘ \n ‘ ) ;

Функцията getline ( ) е член на istream . Функцията getline ( ) чете символи в масива указван от buf докато или бъдат прочетени num символа или бъде срещнат символа определен от delim . Масива указван от buf ще бъде нулево – терминиран от getline ( ) . Ако няма определен параметър от delim по – подразбиране символа за нов ред действа като разграничител . Ако разграничителния символ се срещне във входния поток , той се извлича но не се слага в buf . Тази функция връща псевдоним за потока ( забележете че buf може също да бъде от тип unsigned char * или signed char * ) . Свързани функции са get ( ) и read ( ) .


good ( )


# include < iostream . h >

int good ( ) const ;

Функцията good ( ) е член на ios . Функцията good ( ) връща ненула ако не се срещнат I/O грешки във свързания поток , в противен случай тя връща 0 . Свързани функции са bad ( ) , fail ( ) , eof ( ) , clear ( ) и rdstate ( ) .


ignore ( )


# include < iostream . h >

istream &ignore ( int num = 1 , int delim = EOF ) ;

Функцията ignore ( ) е член на istream . Вие може да използвате член - функцията ignore ( ) да чете и отхвърля символи от входния поток . Тя чете и отхвърля символи докато или бъдат отхвърлени num символа ( 1 по – подразбиране ) или се срещне символа определен от delim ( EOF по – подразбиране ) . Ако се срещне разграничителния символ , той се премахва от входния поток . Функцията връща псевдоним за потока . Свързани функции са get ( ) и getline ( ) .


open ( )


# include < fstream . h >

void open ( const char *filename , int mode ,

int access = filebuf : : openprot ) ;

Функцията open ( ) е член на fstream , ifstream и ofstream . Файл се свързва с поток чрез използване на функцията open ( ) . Тук , filename е името на файла което може да включва и пътя . Стойността на mode определя как да се отвори файла . Тя трябва да бъде една ( или повече ) от тези стойности :

ios : : app ios : : nocreate

ios : : ate ios : : noreplace

ios : : binary ios : : out

ios : : in ios : : trunk

Вие можете да комбинирате две или повече от тези стойности като ги оградите заедно във кръгли скоби . Включването на ios : : app предизвиква целия изход към файла да бъде добавен в края му . Тази стойност може да бъде използвана само с файлове със възможност за изход . Включването на



ios : : ate предизвиква търсене към края на файла до съвпадение когато файла е отворен . Въпреки че ios : : ate предизвиква отместване към края на файла I/O операциите могат да се извършат навсякъде във файла . Стойността ios : : binary предизвиква файла да бъде отворен за двоични I/O операции . По – подразбиране файл се отваря в текстов режим . Стойността ios : : in определя че файла има възможност за вход . Стойността ios : : out определя че файла има възможност за изход . Обаче създаването на поток със използване на ifstream подразбира вход , а създаването на файл чрез използване на ofstream е по – подразбиране изход , така че в тези случай не е необходимо да подавате тези стойности . Стойността ios : : trunk предизвиква съдържанието на предишния съществуващ файл с това име да бъде унищожен и файла да бъде скъсен до нулева дължина . Включването на ios : : nocreate предизвиква функцията open ( ) да пропадне ако файла не съществува . Стойността ios : : noreplace предизвиква функцията open ( ) да пропадне ако файла вече съществува и не са вдигнати също ios : : ate или ios : : app . Стойността на access определя как да бъде достъпен файла . Негова подразбираща се стойност е filebuf : : openprot ( filebuf е базов клас на файловите класове ) което означава нормален файл . Проверете документацията на компилатора за други разрешени стойности на access . Когато отваряте файл и двете mode и access са по – подразбиране . Когато отваряте входен файл , mode ще е по – подразбиране ios : : in . . Когато отваряте изходен файл , mode ще е по – подразбиране ios : : out . Във всички случай access е по – подразбиране за нормален файл . Например този фрагмент отваря файл наречен test за изход :

out . open ( “ test “ ) ; // подразбира се изход и

//нормален файл

За отваряне на поток за вход и изход ще трябва да определите и двете стойности на mode ios : : in и ios : : out както е показано тук :

mystream . open ( “ test “ , ios : : in | ios : : out ) ;

Никакви подразбиращи стойности не се подават на mode когато отваряме файлове за четене / запис . Във всички случай ако open ( ) пропадне потока ще бъде 0 . По тази причина преди да използвате файл ще трябва да проверите да се уверите че отварящата операция е успешна . Свързани функции са



close ( ) , fstream ( ) , ifstream ( ) и ofstream ( ) .

Програмен съвет


За да четете от или да записвате във текстов файл , просто използвайте операторите << и >> с потока който сте отворили . Например следващата програма записва цяло число , стойност със плаваща точка и низ във файла наречен TEST и след това ги прочита отново :

# include < iostream . h >



# include < fstream . h >

int main ( )

{

ofstream out ( “ test “ ) ;

if ( !out ) {

cout << “ Cannot open file . \n “ ;

return 1 ;

}

// изходни данни

оut << 10 << “ “ << 123.33 << “ \n “ ;

out << “ This is a short text file . \n “ ;

out . close ( ) ;

// сега ги четеме обратно

char ch ;

int i ;

float f ;

char str [80] ;

ifstream in ( “ test “ ) ;

if ( !in ) {

cout << “ Cannot open file . \n “ ;

return 1 ;

}

in >> i ;

in >> f ;

in >> ch ;

in >> str ;

cout << “ Here is the data : “ ;

cout << i << “ “ << f << “ “ << ch << “ \n “ :

cout << str ;

in . close ( ) ;

return 0 ;

}

Когато четете текстов файл използвайки оператора >> запомнете че ще се извършат някои символни преобразувания . Например празните символи ще се изпуснат . Ако искате да предотвратите всякакви символни преобразувания , ще трябва да отворите файла за двоичен I/O и да използвате двоичните функции на С++ .


peek ( )


# include < iostream . h >

int peek ( ) ;

Функцията peek ( ) е член на istream . Функцията peek ( ) връща следващия символ в потока или EOF ако е достигнат края на файла . Ако не е така при всички случай тя премахва символа от потока . Свързана функция е get ( ) .


precision ( )


# include < iostream . h >

int precision ( ) const ;

int precision ( int p ) ;

Функцията precision ( ) е член на ios . По – подразбиране се показват шест цифри точност когато се извежда стойност със плаваща точка . Обаче със използването на втората форма на precision ( ) ще можете да установите това число на стойността определена в р . Връща се първоначалната стойност . Първата версия на precision ( ) връща текущата стойност . Свързани функции са width ( ) и fill ( ) .


put ( )


# include < iostream . h >

ostream &put ( char ch ) ;

Функцията put ( ) е член на ostream . Функцията put ( ) записва ch във свързания изходен поток . Тя връща псевдоним за потока . Свързани функции са write ( ) и get ( ) .


putback ( )


# include < iostream . h >

istream &putback ( char ch ) ;

Функцията putback ( ) е член на istream . Функцията putback ( ) връща ch във свързания входен поток .



Забележка : ch трябва да бъде последния прочетен символ от потока .

Свързана функция е peek ( ) .


rdstate ( )


# include < iostream . h >

int rdstate ( ) const ;

Функцията rdstate ( ) е член на ios . Функцията rdstate ( ) връща състоянието на свързания поток . Системата за I/O на С++ поддържа статус информация за резултата от всяка I/O операция отнасяща се до всеки активен поток . Текущото състояние на I/O системата се съдържа в цяло число в което са кодирани следните флагове :



Име Значение

ios : : goodbit Не са станали грешки



ios : : eofbit Срещнат е края на файла

ios : : failbit Станала е нефатална I/O грешка

ios : : badbit Станала е фатална I/O грешка

Тези флагове са изброени във ios . rdstate ( ) връща 0 ( ios : : goodbit ) когато не е станала грешка , в противен случай се установява бита за грешка . Свързани функции са eof ( ) , good ( ) , bad ( ) , clear ( ) и fail ( ) .


read ( )


# include < iostream . h >

istream &read ( char *buf , int num ) ;

Функцията read ( ) е член на istream . Функцията read ( ) чете num байта от свързания входен поток и ги слага във буфер указван от buf ( забележете че buf може също да бъде от тип unsigned char * или signed char * ) . Ако е достигнат края на файла преди да са прочетени num символа , read ( ) просто спира и буфера ще съдържа колкото символа е имало ( Виж “ gcount ( ) “ ) .



read ( ) връща псевдоним за потока . Свързани функции са gcount ( ) , get ( ) , getline ( ) и write ( ) .

seekg ( ) и seekp ( )


# include < iostream . h >

istream &seekg ( streamoff offset , ios : : seek_dir origin ) ;

istream &seekg ( streampos position ) ;

ostream &seekp ( streamoff offset , ios : : seek_dir origin ) ;

ostream &seekp ( streampos position ) ;

Функцията seekg ( ) е член на istream , a функцията seekp ( ) e член на ostream . В системата за I/O на С++ изпълнявате произволен достъп чрез използване на функциите seekg ( ) и seekp ( ) . Към този момент системата на С++ за I/O управлява два указателя свързани със файл . Единия е get pointer който определя къде във файла ще стане следващата входна операция . Другия е put pointer който определя къде във файла ще стане следващата изходна операция . Всеки път когато се извърши въвеждане или извеждане сътветния указател се увеличава автоматично в последователност . Обаче чрез използване на seekg ( ) и seekp ( ) е възможно да достигнете файла по непоследователен начин . Двупараметровата версия на seekg ( ) премества получaващия указател на offset брой байтове от мястото определено от origin . Двупараметровата версия на seekp ( ) премества поставящия указател на offset брой байтове от мястото определено от origin . Параметъра offset е от тип streamoff който е дефиниран в IOSTREAM . H . Обекта streamoff е способен да съдържа най – голямата валидна стойност която може да има offset . Параметъра origin е от тип ios : : seek_dir и е изброяване което има тези стойности :



ios : : beg Отместване от началото

ios : : cur Отместване от текущата позиция

ios : : end Отместване от края

Еднопараметровите версии на seekg ( ) и seekp ( ) преместват файловите указатели на положението определено от position . Тази стойност трябва да бъде получена преди това чрез извикване на tellg ( ) или tellp ( ) съответно . streampos е тип дефиниран във IOSTREAM . H който е способен да съдържа най – голямата валидна стойност която може да има position . Тези функции връщат псевдоним за свързания поток . Свързани функции са tellg ( ) и tellp ( )

setf ( )


# include < iostream . h >

long setf ( long flags ) ;

long setf ( long flags1 , long flags2 ) ;

Функцията setf ( ) е член на ios . Първата версия на setf ( ) вдига форматните флагове определени от flags ( Всички други флагове са непроменени ) . Например за вдигане на флага showpos може да използвате този израз :

stream . setf ( ios : : showpos ) ;

Тук stream е потока върху когото искате да въздействате . Важно е да разберете че извиквзнето на setf ( ) се отнася само за определения поток . Няма концепция за извикване само на setf ( ) . Казано различно няма концепция в С++ за глобално форматно състояние . Всеки поток поддържа собствената си форматна статус информация индивидуално . Когато искате да установите повече от един флаг можете да оградите заедно във кръгли скоби стойностите на флаговете които искате да установите . Втората версия на



setf ( ) въздейства само на флаговете които сте установили във flags2 . Съответните флагове първо са пренастроени и след това вдигнати съгласно флаговете определени от flags1 . Важно е да разберете че дори ако flags1 съдържа друго множество флагове , само онези определени от flags2 ще бъдат засегнати . И двете версии на setf ( ) връщат предишните настройки на форматните флагове свързани със потока . Свързани функции са unsetf ( ) и

flags ( ) .

setmode ( )


# include < fstream . h >

int setmode ( int mode = filebuf : : text ) ;

Функцията setmode ( ) е член на ofstream и ifstream . Функцията setmode ( ) установява режима на свързания поток да бъде двоичен или текстови

( по – подразбиране е текстови ) . Валидни стойности за mode са filebuf : : text и filebuf : : binary . Функцията връща предишната настройка на режима или -1 ако стане грешка . Свързана функция е open ( ) .

str ( )


# include < strstrea . h >

char *str ( ) ;

Функцията str ( ) е член на strstream . Функцията str ( ) “ замразява “ динамично заделения входен масив и връща указател към него . Веднъж щом динамичен масив е замразен , той не може да бъде използван отново за изход . По тази причина няма да искате да замразявате масив докато не изведете изцяло символите към него .



Забележка : Тази функция е за употреба със базиран на масиви I/O .

Свързани функции са strstream ( ) , istrstream ( ) и ostrstream ( ) .


strstream ( ) , istrstream ( ) и ostrstream ( )


# include < strstrea . h >

strstream ( ) ;

strstream ( char *buf , int size , int mode ) ;

istrstream ( const char *buf ) ;

istrstream ( const char *buf , int size ) ;

ostrstream ( ) ;

ostrstream ( char *buf , int size , int mode = ios : : out ) ;

Конструктора strstream ( ) е член на strstream , конструктора istrstream ( ) е член на istrstream и конструктора ostrstream ( ) е член на ostrstream . Тези конструктори се използват да създадат базирани на масиви потоци които поддържат функциите на С++ за I/O базирани на масиви . За ostrstream ( ) buf е указател към масив който събира символите записани във потока . Големината на масива се подава чрез параметъра size . По – подразбиране потока е отворен за нормален изход , но можете да определите различен режим чрез използване на параметъра mode . Разрешенитe стойности за mode са същите като тези използвани в open ( ) . За повечето цели mode ще бъде оставен по – подразбиране . Ако използвате безпараметровата версия на ostrstream ( ) ще бъде заделен автоматично динамичен масив . За еднопараметровата версия на istrstream ( ) buf е указател към масива който ще бъде използван като източник на символи всеки път когато се извършва въвеждане във потока . Съдържанието на buf трябва да бъде нулево – терминирано . Обаче нулевия терминатор никога не се чете от масива . Ако искате само част от масива да бъде използвана за вход , използвайте двупараметровата форма на конструктора istrstream ( ) . Тaкa само първите size елемента от масива указван от buf ще бъдат използвани . Този низ не трябва да бъде нулево – прекъснат понеже стойността на size определя размера на низа . За създаване на базиран на масиви поток способен за вход и изход използвайте strstream ( ) . В еднопараметровата версия , buf сочи към низ който ще бъде използван за I/O операции . Стойността на size определя размера на масива . Стойността на mode определя как да функционира масива . За нормални входно / изходни операции mode ще бъде ios : : in | ios : : out . За вход масива трябва да бъде нулево – прекъснат . Ако използвате безпараметровата версия на strstream ( ) буфера използван за I/O ще бъде динамично заделен и режима ще бъде установен на четящи / записващи операции . Свързани функции са str ( ) и open ( ) .


sync_with_stdio ( )


# include < iostream . h >

static void sync_with_stdio ( ) ;

Функцията sync_with_stdio ( ) е член на ios . Извикването на sync_with_stdio ( ) позволява стандартната С – базирана система за I/O да бъде безопасно използвана едновременно със класово – базираната система на С++ за I/O .


tellg ( ) и tellp ( )


# include < iostream . h >

streampos tellg ( ) ;

streampos tellp ( ) ;

Функцията tellg ( ) е член на istream , a функцията tellp ( ) e член на ostream . Системата за I/O на С++ управлява два указателя свързани със файл . Единия е get pointer който определя къде във файла ще стане следващата входна операция . Другия е put pointer който определя къде във файла ще стане следващата изходна операция . Всеки път когато се извърши въвеждане или извеждане сътветния указател се увеличава автоматично и последователно . Вие можете да определите текущата позиция на get pointer използвайки tellg ( ) и на put pointer използвайки tellp ( ) . streampos е тип дефиниран във IOSTREAM . H , който е способен да съдържа най – голямата стойност която всяка от функциите може да върне . Стойностите върнати от tellg ( ) и tellp ( ) могат да бъдат използвани като параметри съответно на seekg ( ) и seekp ( ) . Свързани функции са seekg ( ) и seekp ( ) .


unsetf ( )


# include < iostream . h >

long unsetf ( long flags ) ;

Функцията unsetf ( ) е член на ios . Функцията unsetf ( ) се използва да свали един или повече форматни флага . Флаговете определени от flags се свалят

( всички други флагове остават непроменени ) . Връщат се предишните флагови настройки . Свързани функции са setf ( ) и flags ( ) .

width ( )


# include < iostream . h >

int width ( ) const ;

int width ( int w ) ;

Функцията width ( ) е член на ios . За да получите текущата ширина на полето използвайте първата форма на width ( ) . Taзи версия връща текущата ширина на полето . За да установите ширината на полето използвайте втората форма . Така w става новата ширина на полето , а се връща старата стойност . Свързани функции са precision ( ) и fill ( ) .


write ( )


# include < iostream . h >

ostream &write ( const char *buf , int num ) ;

Функцията write ( ) е член на ostream . Функцията write ( ) записва num байта в определения изходен поток от буфера указван чрез buf ( забележете че buf може също да бъде от тип unsigned char * или signed char * ) . Тя връща псевдоним за потока . Свързани функции са read ( ) и put ( ) .





Каталог: books
books -> Тайнствената сила на пирамидите Богомил Герасимов Страхът на времето
books -> В обятията на шамбала
books -> Книга се посвещава с благодарност на децата ми. Майка ми и жена ми ме научиха да бъда мъж
books -> Николай Слатински “Надеждата като лабиринт” София, Издателство “виденов & син”, 1993 год
books -> София, Издателство “Българска книжница”, 2004 год. Рецензенти доц д. ик н. Димитър Йончев, проф д-р Нина Дюлгерова Научен редактор проф д-р Петър Иванов
books -> Николай Слатински “Измерения на сигурността” София, Издателство “Парадигма”, 2000 год
books -> Книга 2 щастие и успех предисловие
books -> Превръщане на числа от една бройна система в друга
books -> Тантриското преобразяване


Сподели с приятели:
1   ...   8   9   10   11   12   13   14   15   ...   19




©obuch.info 2024
отнасят до администрацията

    Начална страница