ГЛАВА 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 ( ) .
Сподели с приятели: |