Programmer’s Reference


ГЛАВА 6 – Стандартни C I/O функции



страница7/19
Дата21.09.2016
Размер2.35 Mb.
#10416
1   2   3   4   5   6   7   8   9   10   ...   19

ГЛАВА 6 – Стандартни C I/O функции.

Тази глава описва стандартните C I/O функции.Тези функции са дефинирани чрез ANSI C стандарт и всички С компилатори са снабдени с тях в техните стандартни библиотеки.Те са също поддържани от С++ да доставят съвместимост със С и няма фундаментална причина да не ги използвате във вашите С++ програми, когато сметнете за необходимо . Понеже функциите в тази глава са специфични за ANSI C стандарта, те ще бъдат обяснени общо като ANSI C I/O системата. Хедърния файл, свързан със стандартните I/O функции е наречен STDIO . H . Той дефинира няколко макроса и типа, използвани от файловата система . Най-важният тип е FILE, който се използва да декларира файлов указател.Два други типа са size_t и fpos_t , които са друга форма на unsigned integer . Типа size_t дефинира обект, който е способен да съдържа размера на най-големия файл, разрешен от операционната среда . Типа fpos_t дефинира обект , който може да съдържа информация, нужна за единствено определяне на всяка позиция във файла . ANSI C I/O системата оперира чрез потоци . Потока е логическо устройство, което е свързано към действително физическо устройство, което е отнесено към файла . В ANSI C I/O системата всички потоци имат еднакви способности , но файловете могат да имат различаващи се качества . Например дисковия файл разрешава произволен достъп , но модема-не .Така ANSI C I/O системата доставя ниво на абстракция между програмиста и физическото устройство . Абстракцията е поток а устройството е файла . По този начин съставния логически интерфейс може да бъде поддържан дори и действителните логически устройства да са различни . Потока се свързва към файл чрез извикване на fopen ( ) .Потоците действат върху тях чрез файлов указател ( който е указател от типа *FILE ) В този смисъл файловия указател е закрепен така , че да държи системата заедно . Когато вашата програма започне изпълнение три предефинирани потока се отварят автоматично . Те са stdin , stdout и stderr насочени съответно към стандартния вход , стандартния изход и стандартната грешка.По подразбиране те са свързани към конзолата , но могат да бъдат преадресирани към всякакъв тип устройство . Много от стандартните библиотечни I/O функции установяват вградена глобална целочислена променлива errno когато се случи грешка . Вашата програма може да провери тази променлива, когато се получи грешка, за да получи повече информация за грешката . Стойностите , които errno може да взима зависят от изпълнението .


clearerr ( )


#include < stdio . h >

void clearerr ( FILE *stream ) ;

Функцията clearerr ( ) пренастройва ( тоест установява на нула ) флага за грешка свързан със потока указан чрез stream EOF индикатора също се пренастройва . Флаговете за грешка на всеки поток са първоначално установени на 0 чрез успешното извикване на fopen ( ) . Когато се случи грешка флаговете се установяват чрез явно извикване на една от функциите clearerr ( ) или rewind ( ) .Файлови грешки могат да се получат по много причини много от които са системно зависими . Точния вид грешка може да се определи чрез извикване на perror ( ) , която показва информация за грешките . ( Виж perror ( )) Свързани функции са feof ( ) , ferror ( ) и perror ( ) .


fclose ( )


#include < stdio .h >

int fclose ( FILE * stream );

Функцията fclose ( ) затваря файла свързан със stream и изчиства неговия буфер . След fclose ( ) stream се освобождава от файла и всеки автоматично заделен буфер се освобождава . Ако fclose ( ) е успешна се връща 0 иначе се връща EOF . Опит за затваряне на файл който а вече бил затворен генерира грешка . Премахването на съхранените данни преди затварянето на файла също ще генерира грешка , както и липсата на достатъчно дисково пространство . Свързани функции са fopen ( ) , freopen ( ) и fflush ( ) .


feof ( )


#include < stdio . h>

int feof ( FILE * stream );

Функцията feof ( ) проверява индикатора за край на файл за да определи дали края на файла свързан със stream е достигнат . Ненулева стойност се връща ако индикатора за край на файл е в края , 0 се връща в противен случай . Веднъж когато е достигнат края на файл следващите четящи операции ще върнат EOF докато е извикана една от двете функции rewind ( ) e извикана или позициониращия индикатор е преместен със fseek ( ) . Макроса EOF е дефиниран в STDIO .H . feof ( ) e особенно полезна когато работим със двоични файлове защото маркера за край на файл е също валидно двоично цяло число . Изрично извикване трябва да бъде направено отколкото просто проверяване на върнатата стойност от getc ( ) например за да определим дали е достигнат край на файл . Свързани функции са clearer( ) , ferorr ( ) , perror ( ) , putc ( ) и getc ( ) .


ferror ( )


#include < stdio .h>

int ferror ( FILE * stream ) ;

Функциата ferror ( ) проверява за грешки файла подаден й във stream . Върната стойност 0 показва че не е станала грешка , докато ненулева стойност означава грешка . Флаговете за грешка свързани със stream ще останат вдигнати докато или файла се затвори или rewind ( ) или clearer ( ) се извикат .За определяне на точната природа на грешката използвайте perror ( ) .Свързани функции са clearer ( ) , feof ( ) и perror ( ) .


fflush ( )


# include < stdio .h >

int fflush ( FILE * stream ) ;

Ако stream е свързан със файл отворен за запис извикването на fflush ( ) ще предизвика съдържанието на изходния буфер да бъде физически записан във файла . Ако stream указва входен файл , съдържанието на входния буфер ще се изчисти . Във всички случай файла остава отворен . Върната стойност 0 означава успех , EOF показва че е станала грешка при запис . Всички буфери се изчистват при нормално прекъсване на програмата или когато се напълнят . Също затварянето на файл изчиства неговия буфер . Свързани функции са fclose ( ) , fopen ( ) , fread ( ) , fwrite ( ) , getch ( ) и putc ( ) .


fgetc ( )


# include < stdio .h >

int ( FILE * stream ) ;

Функцията fgetc ( ) връща следващия символ от входния поток на текущата позиция и увеличава позиционния файлов индикатор . Символа се чете като unsigned char и тогава се преобразува в цяло число . Ако е достигнат края на файла fgetc ( ) връща EOF . Обаче откакто EOF е валидна цяла стойност когато работим с двоични файлове трябва да използвате feof ( ) за да проверите дали е достигнат край на файл . Ако fgetc ( ) срещне грешка , EOF се също връща . Ако работите със двоични файлове трябва да използвате ferror ( ) за проверка за грешки във файла . Свързани функции са fputc ( ) , getc ( ) , putc ( ) и fopen ( ) .


fgetpos ( )


# include < stdio . h>

int fgetpos ( FILE * stream , fpos_t position ) ;

Функцията fgetpos ( ) съхранява текущата стойност на файловия позициониращ индикатор в обект указван от position . Обекта указван от position трябва да бъде от тип fpos_t който е дефиниран в STDIO.H . Стойността съхранявана там е полезна само в следващото извикване на fgetpos ( ) . Ако стане грешка fgetpos ( ) връща ненула , в противен случай връща 0 .Свързани функции са fsetpos ( ) , fseek ( ) и ftell ( ) .


fgets ( )


# include < stdio .h >

char * fgets ( char * str , int num , FILE * stream ) ;

Функцията fgets ( ) чете num – 1 символа от stream и ги поставя в масив от символи указван от str . Символи се четат докато нов ред или EOF се получи или докато е достигнат определения лимит . След като се прочетат символите се поставя 0 в масива веднага след последния прочетен символ . Символа за нов ред ще бъде запазен и ще бъде част от str . Ако е успешна fgets ( ) връща str , нулев указател се връща при срив . Ако стане грешка при четене съдържанието на масива указван от str ще е неопределено .Понеже нулев указател ще се върне или когато стане грешка или когато е достигнат край на файла ще трябва да използвате feof ( ) или ferror ( ) за да определите какво действително е станало . Свързани функции са fputs ( ) , fgetc ( ) ,getc ( ) и puts ( ) .


fopen ( )


# include

FILE * fopen ( const char * fname , const char * mode ) ;

Функцията fopen ( ) отваря файл чието име е указано от fname и връща поток който е свързан с него . Типа на разрешените операции са определени от стойноста на mode . Разрешените стойности за mode са показани в следващата таблица . Файловото име трябва да бъде низ от символи съставящи валидно име определено от оперционната система и може да включва специфични пътища ако средата ги поддържа .



режим значение

r “ Отваря текстов файл за четене

w “ Създава текстов файл за писане

“ a “ Добавя към текстов файл

“ rb “ Отваря двоичен файл за четене

“ wb “ Създава двоичен файл за запис

“ ab “ Добавя към двоичен файл

r+ “ Отваря текстов файл за

четене / запис

“ w+ “ Създава текстов файл за

четене / запис



“ a+ “ Отваря текстов файл за

четене / запис



“ rb+ “ Отваря двоичен файл за

четене / запис

wb+ “ Създава двоичен файл за

четене / запис



“ ab+ “ Отваря двоичен файл за

четене / запис

Ако fopen ( ) е успешна в отварянето на определения файл се връща указател FILE . Ако файла не може да се отвори се връща нулев указател . Както показва таблицата файл може да бъде отворен или текстов или в двоичен режим . В текстов режим могат да станат някой символни преобразувания . Например нов ред може да бъде преобразуван във връщане на каретка / начало на ред . Никакви подобни преобразувания не стават във двоичните файлове . Правилния начин за отваряне на файл е илюстриран със следния фрагмент от код :

FILE *fp ;



if ( ( fp == fopen ( “ test “ , “ w “ ) ) == NULL ) {

printf ( “ Cannot open file . \n “ ) ;

exit ( 1 ) ;

}

Този метод открива всяка грешка при отварянето на файл като например защитен срещу запис или пълен диск ,преди да опита да пише в него . NULL се използва да покаже грешка понеже няма файлов указател който да има такава стойност . NULL е дефиниран в STDIO . H . Ако използвате fopen ( ) да отвори файл за изход всеки предишен файл с това име ще бъде изтрит и ще се запише новия файл . Ако няма файл със такова име той ще бъде създаден . Ако искате да добавите към края на файл трябва да използвате режим “ а ” . Ако файла не съществува ще бъде върната грешка . Отварянето на файл за четене изисква файла да съществува . Ако не съществува ще се върне грешка . Накрая ако файла е отворен за четене / запис той няма да бъде изтрит ако съществува , обаче ако не съществува ще бъде създаден . Когато имате достъп до файл отворен за четене / запис не можете да редувате изходни със входни операции без обръщане към функциите fflush ( ) , fseek ( ) , fsetpos ( ) или rewind ( ) . Също не можете да редувате входна операция със изходна без извикване на една от предишните функции . Свързани функции са fclose ( ) , fread ( ) , fwrite ( ) ,putc ( ) и getc ( ) .


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


Всеки файл може да бъде отворен или като текстов или като двоичен . Няма значение какво в действителност съдържа файла . Например файл който съдържа ASCII текст може също да бъде отворен и обработван като двоичен файл . Що се отнася до ANSI C файловата система единствената разлика между текстовия и двоичния файл е че в него няма символни преобразувания които ще се заместят когато оперирате върху файл отворен в двоичен режим . Вие може да искате да отворите файл който съдържа текст като двоичен когато изпълнявате различни не – текстово базирани манипулации върху него . Например за файловите действия като сравняване , компресиране или сортиране ще трябва да имате достъп до файла в двоичен режим . Също файловите кодиращи програми почти винаги ще трябва да работят в двоичен режим . Ключовата точка е че разликата между текстовия и двоичния файл не е какво съдържа файла , а по скоро начина по който сте го отворили .

fprintf ( )


# include < stdio . h >

int fprintf ( FILE *stream , const char *format , . . . ) ;

Функцията fprintf ( ) извежда стойностите на аргументите които съставят списъка със аргументи във низа format във поток указван от stream . Върнатата стойност е броя на действително записаните символи . Ако стане грешка се връща отрицателно число . Може да има от 0 до няколко аргумента с максимален брой зависещ от системата . Операциите за форматен контрол и командите са идентични на тези във printf ( ) ( виж “ printf “ за пълно описание ). Свързани функции са printf ( ) и scanf ( ) .


fputc ( )


# include < stdio . h >

int fputc ( int ch , FILE *stream ) ;

Функцията fputc ( ) записва символа ch във определения поток във текущата позиция във файла и след това увеличава индикатора на позицията . Въпреки че ch е декларирана да бъде int по исторически причини , тя се преобразува от fputc ( ) във unsigned char понеже всички символни аргументи са повишени в цели числапо време на тяхното извикване , вие сте свободни да използвате символни променливи като аргументи . Ако използвате число , старшия байт просто ще бъде отхвърлен . Стойността върната от fputc ( ) e стойността на записания символ . Ако стане грешка се връща EOF . За файлове отворени за двоични операции , EOF може да е валиден символ и ще ви трябва функцията ferror ( ) за да определите дали в действителност е станала грешка . Свързани функции са fgetc ( ) , fopen ( ) fprintf ( ) , fread ( ) и fwrite ( ) .


fputs ( )


# include < stdio . h >

int fputs ( const char *str , FILE *stream ) ;

Функцията fputs ( ) записва съдържанието на низа указван от str в определения поток . Нулевия терминатор не се записва . Функцията fputs ( ) връща неотрицателна стойност при успех и EOF при грешка . Ако потока е отворен в текстови режим ще станат определени символни преобразувания . Това означава че може да няма едно към едно съпоставяне на низа във файла . Обаче ако потока е отворен в двоичен режим никакви символни преобразувания няма да има и ще има едно към едно съпоставяне между низа и файла . Свързани функции са fgets ( ) , gets ( ) ,puts ( ) , fprintf ( ) и fscanf ( ) .


fread ( )


# include < stdio .h >

int fread ( void * buf , size_t size , size_t count ,

FILE *stream ) ;

Функцията fread ( ) чете count брой обекти , всеки обект със size байта дължина от поток указван от stream и ги поставя в масив указван от buf . Индикатора за файлова позиция се увеличава със броя на прочетените символи . Функцията fread ( ) връща броя на действително прочетените обекти . Ако са прочетени по – малко обекти от заявените при извикването , или е станала грешка или е достигнат края на файла . Трябва да използвате feof ( ) или ferror ( ) за да определите какво е станало . Ако потока е отворен за текстови операции могат да станат определени символни преобразувания като връщане на каретка / начало на нов ред . Свързани функции са fwrite ( ) , fopen ( ) , fscanf ( ) ,fgetc( ) и getc ( ) .


freopen ( )


# include < stdio .h >

FILE *freopen ( const char fname , const char *mode , FILE

*stream ) ;

Функцията freopen ( ) свързва съществуващ поток със различен файл . Новото файлово име е указано от fname , режима за достъп е указан чрез mode , и потока за който е предназначен е указан от stream . Низа mode използва същия формат като fopen ( ) пълно разглеждане е направено във секцията “ fopen “ . Когато е извикана , freopen ( ) първо опитва да затвори файла който може текущо да е свързан със stream . Обаче ако опита за затваряне на файла пропадне , freopen ( ) още продължава към отваряне на друг файл . Функцията връща указател към stream при успех и нулев указател в противен случай . Главната употреба на freopen ( ) е пренасочване на системно дефинираните файлове stdin , stdout и stderr към някакъв друг файл . Свързани функции са fopen ( ) и fclose ( ) .


fscanf ( )


# include < stdio . h >

int fscanf ( FILE * stream , const char format , . . . ) ;

Функцията fscanf ( ) работи точно като функцията scanf ( ) с изключение на това че тя чете информация от потока определен от stream , вместо от stdin

( виж “scanf “ за подробности ) .Функцията fscanf ( ) връща броя на аргументите с действително присвоени стойности . Този брой не включва прескачаните полета . Върната стойност EOF значи че е станала грешка преди да е направено първото присвояване . Свързани функции са scanf ( ) и fprintf ( ) .

fseek ( )


# include < stdio . h >

int fseek ( FILE *stream , long offset , int origin ) ;

Функцията fseek ( ) установява пзициониращия индикатор свързан със stream съгласно стойностите на offset и origin .Нейна задача е поддържката на операции с произволен I /O достъп .offset е брой байтове от origin който е достигнат . Стойността на origin трябва да бъде един от тези макроси ( дефинирани във STDIO . H ) :



Име Значение

SEEK_SET Отместване от началото на файл



SEEK_CUR Отместване от текущото

положение



SEEK_END Отместване от края на файл

Върната стойност 0 значи че fseek ( ) е успяла . Ненулева стойност значи грешка . Можете да използвате fseek ( ) да местите позициониращия индикатор навсякъде във файла , дори извън края . Обаче е грешка опита да установите индикатора преди началото на файла . Функцията fseek ( ) изчиства флага за край на файл свързан със определения поток . Нещо повече , тя анулира всякаква по – ранна ungetc ( ) на същия поток ( виж “ ungetc( ) “ ) .Свързани функции са ftell ( ) , rewind ( ) , fopen ( ) ,fgetpos ( ) и fsetpos ( ) .


fsetpos ( )


# include < stdio . h >

int fsetpos ( FILE *stream , const fpos_t *position ) ;

Функцията fsetpos ( ) премества позициониращия индикатор към точка определена от обекта указван от position . Тази стойност трябва да бъде получена преди това чрез извикване на fsetpos ( ) . Типа fpos_t е дефиниран в STDIO . H .След изпълнението на fsetpos ( ) индикатора за край на файл се пренастройва . Също всяко предишно извикване на ungetc ( ) се анулира . Ако fsetpos ( ) пропадне се връща ненула , ако е успешна връща 0 . Свързани функции са fgetpos ( ) , fseek ( ) и ftell ( ) .


ftell ( )


# include < stdio .h >

long ftell ( FILE * stream ) ;

Функцията ftell ( ) връща текущата стойност на позиционния индикатор на определения поток . В случай на двоични потоци стойността е броя на байтовете до индикатора от началото на файла . За текстови потоци връщаната стойност може да не е от главно значение с изключение за аргумент на fseek ( ) понеже възможните символни преобразувания такива като връщане на каретка / начало на ред ще бъдат заместени с нови редове което влияе върху действителната големина на файла . Функцията ftell ( ) връща -1 когато стане грешка . Ако потока е неспособен за произволно търсене - ако е модем например – връщаната стойност е неопределена . Свързани функции са fseek ( ) и fgetpos ( ) .


fwrite ( )


# include < stdio . h >

int fwrite ( const void *buf , size_t size , size_t count ,

FILE *stream ) ;

Функцията fwrite ( ) записва count броя обекти , всеки обект имащ size байта дължина в поток указван от stream от символния масив указван от buf . Позиционния индикатор се увеличава с броя на записаните символи . Функцията fwrite ( ) връща броя на действително записаните обекти които ако функцията е успешна ще са равни на заявения брой . Ако са записани по – малко обекти от заявените се е получила грешка . За текстови потоци могат да станат различни символни преобразувания но те няма да имат ефект върху връщаната стойност . Свързани функции са fread ( ) , fscanf ( ) , getc ( ) и fgetc ( ) .


getc ( )


# include < stdio .h >

int getc ( FILE *stream ) ;

Функцията getc ( ) връща следващия символ от входния поток на текущата позиция и увеличава позиционния индикатор . Символа се чете като unsigned char и се конвертира в integer . Ако е достигнат край на файл getc ( ) връща EOF . Обаче откакто EOF e валидна целочислена стойност , когато работите със двоични файлове вие трябва да използвате feof ( ) за проверка за символа за край на файл . Ако getc ( ) срещне грешка също се връща EOF . Ако работите със двоични файлове трябва да използвате ferror ( ) за да проверите за грешки . Функциите getc ( ) и fgetc ( ) са идентични и в повечето изпълнения getc ( ) е просто дефинирана като макроса показан тук :

# define getc ( fp ) fgetc ( fp )

Това предизвиква функцията fgetc ( ) да бъде заместена със getc ( ) макроса . Свързани функции са fputc ( ) , fgetc ( ) , putc ( ) и fopen ( ) .


getchar ( )


# include < stdio . h >

int getchar ( void ) ;

Функцията getchar ( ) връща следващия символ от stdin . Символа се чете като unsigned char и се конвертира в integer . Ако е достигнат края на файла getchar ( ) връща EOF . Обаче откакто EOF е валидна цяла стойност когато работите със двоични файлове ще трябва да използвате feof ( ) за да провери за края на файла . Ако getchar ( ) срещне грешка се също връща EOF . Ako работите със двоични файлове трябва да използвате ferror ( ) да проверите за грешки . Функцията getchar ( ) често се изпълнява като макрос . Свързани функции са fputc ( ) , fgetc ( ) , putc ( ) и fopen ( ) .


gets ( )


# include < stdio .h >

char *gets (char *str ) ;

Функцията gets ( ) чете символи от stdin и ги поставя в масив от символи указван от str . Символи се четат докато се получи нов ред или EOF . Символа за нов ред не е част от низа , вместо това той се преобразува в 0 за прекъсване на низа . Ако е успешна gets ( ) връща str , при грешка се връща нулев указател . Ако стане грешка съдържанието на масива указван от str е неопределено . Понеже нулев указател ще бъде върнат или когато стане грешка или когато е достигнат края на файла , ще трябва да използвате feof ( ) или ferror ( ) за да определите какво е станало в действителност . Няма начин да ограничите броя на символите които gets ( ) ще прочете и по тази причина ще трябва да направите така че масива указван от str да не бъде препълнен ( Вижте “Програмен съвет “ по долу ) . Свързани функции са fputc ( ) , fgetc ( ) , fgets ( ) и puts ( ) .


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


Когато използвате gets ( ) е възможно да препълните масива който се използва да получи въведените символи понеже gets ( ) не прави проверка на границите . Един начин да заобиколите този проблем е да използвате fgets ( ) определяйки stdin за входен поток . Откакто fgets ( ) изисква да определите максимална дължина е възможно да избегнете препълване на масива . Единствения проблем е че fgets ( ) не премахва символа за нов ред , така че вие ще трябва ръчно да го премахнете както е показано в следната програма :

# include < stdio .h >



# include < string .h >

int main ( void )

{

char str [10] ;

int i ;

printf ( “ Enter a string : “ ) ;

fgets ( str , 10 , stdin ) ;

/ * премахва нов ред ако се срещне * /

i = strlen ( str ) – 1 ;

if ( str [ i ] == ‘ \n ’ ) str [ i ] = ‘ \0 ‘ ;

printf ( “ This is your string : %s “ , str ) ;

return 0 ;

}

Въпреки че употребата на fgets ( ) изисква малко повече работа нейното предимство пред gets ( ) е че можете да избегнете препълване на входния масив .


perror ( )


# include < stdio .h>

void perror ( const char *str ) ;

Функцията perror ( ) свързва стойността на глобалната променлива errno към низ и записа този низ в stderr . Ако стойността на str не е 0 , низа се записва първи следван от двоеточие и тогава зависимо от изпълнението съобщение за грешка .


printf ( )


# include < stdio .h >

int printf ( const char *format , . . . ) ;

Функцията printf ( ) записва в stdout аргументите които съставят списъка й от аргументи като определят низа указван от format . Низа указван от format се състои от два типа съставящи . Първия тип е съставен от символи които ще бъдат изведени на екрана . Втория тип съдържа форматни команди които определят начина на показване на аргументите .Форматните команди започват със знака за процент и след това форматен код . Трябва да има точно същия брой аргументи към форматните команди и да се свързват по ред . Например следното извикване на printf ( ) показва “ Hi c 10 there! “ :



printf ( “ Hi %c %d %s “ , ‘c’ , 10 , “ there! “ ) ;

Ако има несъответстващи аргументи отговарящи на форматните команди , изхода е неопределен . Ако има повече аргументи отколкото форматни команди останалите аргументи се отхвърлят . Форматните команди са показани тук :



Код Формат

%c Символ



%d Десетично цяло число със знак

%i Десетично цяло число със знак

%e Научно означение ( малко е )

%E Научно означение ( голямо Е )

%f Число със десетична точка

%g Използва %e или %f което е

по – късо ( ако използва малко е )



%G Използва или %f което е

по – късо ( ако използва

голямо Е )

Осмично число без знак

%s Низ от символи

%u Десетично цяло число без знак

%x Шестнайсетично цяло число без знак

( малки букви )

%X Шестнайсетично цяло число без знак

( големи букви )

%p Показва указател



%n Свързания аргумент трябва да бъде указател към integer в който са поставени символи

%% Отпечатва %

Функцията printf ( ) връща броя на действително отпечатаните символи . Отрицателна върната стойност показва че е станала грешка . Форматните команди могат да имат модификатори които определят полетата ширина , точност и ляво – подравнителен флаг . Цяло число поставено между % и форматната команда действа като спецификатор за минимална големина на полето . Това запълва изхода със интервали или 0 като осигурява най – малкия определен минимум дължина . Ако низа от числа е по – голям от минимума той ще бъде отпечатан целия дори ако препълва минимума . Подразбиращото запълване е направено със интервали . Ако искате запълване със 0 сложете 0 преди спецификатора за ширина . Например % 05d ще запълни число с по – малко от 5 цифри с 0 така че неговата обща дължина да е 5 . Точното значение на ограничителя за точност зависи от форматния код който ще се изменя . За да добавите ограничител за точност сложете десетична точка следвана от точността след спецификатора за ширина на полето . За е , Е и f форматите ограничителя определя числата след десетичната точка . Например %10.4f ще покаже най – малко 10 символна големина с четири цифри след точката . Когато ограничителя за точност е добавен към g или G форматни кодове , той определя максимално число на показаните означени цифри . Когато е добавено към integer ограничителя определя минималния брой числа които ще бъдат показани . Водещите 0 се добавят ако е необходимо .Когато точностния ограничител е добавен към низ числото следвано от периода определя максималната дължина на полето . Например %5.7s ще покаже низ който ще е най – малко 5 символа дълъг и няма да надхвърля 7 . Ако низа е по – дълъг от максималната ширина на полето символите ще бъдат отрязани в края . По подразбиране целия изход е дясно подравнен ; ако ширината на полето е по – голяма от отпечатваните данни , данните ще бъдат поставени от десния край на полето . Вие можете да направите информацията да бъде ляво подравнена чрез поставяне на знак минус точно след % . Например % - 10.2f ще е ляво подравнено число с плаваща точка и със две числа след точката в поле със 10 символа . Има две форматни командни ограничителя които позволяват printf ( ) да показва къси и дълги integers . Тези модификатори може да бъдат добавени към d , i , o , u и х типовите спецификатори . Модификатора l казва на printf ( ) че следва дълъг тип данни . Например %ld значи че ще бъде показано дълго цяло число . h модификатора казва на printf ( ) да покаже късо цяло число . Така %hu показва че данните са от тип късо цяло число без знак . l модификатора може също да е пред командите e , f и g и показва че следва double . Изхода за long double използва %L префикс . Командата %n педизвиква броя на символите които ще се отпечатят когато се срещне %n да се постави в целочислена променлива която е указана чрез нейния съответстващ аргумент . Например този фрагмент от код показва число 14 след линията “ This is a test “ :

int i ;

printf ( “This is a test %n “, &i ) ;

printf ( “%d “ , i ) ;

Символа # има специално значение когато се използва с някой printf ( ) форматни кодове . Предшествайки g , f и e кода c # осигурява че десетичната точка ще се покаже , дори ако няма числа след нея . Ако поставите пред x формата # шестнайсетичното число ще бъде отпечатано със префикс 0x . Ако поставите пред формата о # , осмичната стойност ще бъде отпечатена със префикс 0 . # не се добавя към никакви други форматни спецификатори . Минималната големина на полето и спецификаторите за точност могат да бъдат доставени чрез аргументи на printf ( ) вместо чрез константи . За да постигнете това използвайте * като съхранител . Когато форматния стринг е сканиран , printf ( ) ще съпостави всеки * към аргумента в реда в който се срещат . Свързани функции са scanf ( ) и fprintf ( ) .


putc ( )


# include < stdio . h >

int putc ( int ch , FILE *stream ) ;

Функцията putc ( ) записва символа съдържан в най – малкия означен байт на ch към изходния поток указван от stream . Понеже символните аргументи се издигат във integer по време на тяхното извикване , можете да използвате символни променливи като аргументи на putc ( ) . Функцията putc ( ) връща записания символ при успех или EOF ако е станала грешка . Ако изходния поток е бил отворен в двоичен режим , EOF е валидна стойност за ch . Това означава че трябва да използвате ferror ( ) за да определите дали е станала грешка . Свързани функции са fgetc ( ) , fputc ( ) , getchar ( ) и putchar ( ) .


putchar ( )


# include < stdio .h >

int putchar ( int ch ) ;

Функцията putchar ( ) записва символа съдържан в най – малкия означен байт на ch в stdout .Тя е функционално еквивалентна на putc( ch , stdout ) . Понеже символните аргументи се издигат в integer по време на тяхното извикване , вие може да използвате символни променливи като аргументи на putchar ( ) . Функцията putchar ( ) връща записания символ при успех или EOF при грешка. Ако изходния поток е бил отворен в двоичен режим , EOF e валидна стойност за ch . Това означава че вие трябва да използвате ferror ( ) да определите дали е станала грешка . Свързана функция е putc ( ) .


puts ( )


# include < stdio . h >

int puts ( char * str ) ;

Функцията puts ( ) записва низа указван от str към стандартно изходно устройство . Нулевия терминатор се преобразува в нов ред . Функцията puts ( ) връща неотрицателна стойност ако е успешна и EOF при срив . Свързани функции са putc ( ) , gets ( ) и printf ( ) .


remove ( )


# include < stdio . h >

int remove ( const char *fname ) ;

Функцията remove ( ) изтрива файла определен от fname . Тя връща 0 ако файла е успешно изтрит и ненула ако е станала грешка . Свързана функция е



rename( ).

rename ( )


# include < stdio . h >

int rename ( const char *oldfname , const char *newfname ) ;

Функцията rename ( ) променя името на файла определено от oldfname на newfname . Newfname не трябва да е никакво съществуващо име . Функцията връща 0 ако е успешна и ненула ако е станала грешка . Свързана функция е remove ( ) .


rewind ( )


# include < stdio . h >

void rewind (FILE *stream ) ;

Функцията rewind ( ) премества позициониращия индикатор към началото на определения поток . Тя също изчиства края на файла и флаговете за грешка свързани със stream . Не връща стойност . Свързана функция е fseek ( ) .


scanf ( )


# include < stdio . h >

int scanf ( const char *format , . . . ) ;

Функцията scanf ( ) е общо възприетия начин за вход който чете потока stdin и съхранява информацията в променливи указвани от списъка със аргументи . Тя може да чете всички вградени типове данни и автоматично да ги преобразува в подходящия вътрешен формат . Контролния низ указван от format е съставен от три класификации за символи :

Форматни спецификатори

Символи за празни пространства

Символи за непразни пространства

Форматните спецификатори се предшестват от знака % и казват на scanf ( ) какъв тип данни да бъде прочетен след това . Например %s прочита низ докато %d прочита integer . Кодовете на scanf ( ) се съпоставят в ред със променливите получаващи входа в аргументния списък . Тези кодове са изброени в следната таблица :

код значение

%c Чете единствен символ



%d Чете десетично цяло число

%i Чете цяло число

%e Чете число с точка

%f Чете число с точка

%g Чете число с точка

%o Чете осмично число %s Чете низ

%x Чете шестнайсетично число

%p Чете указател

%n Получава целочислена стойност

равна на броя на прочетените

досега символи

%u Чете цяло число без знак

%[ ] Сканира за множество символи

%% Чете знака %

Форматния низ се чете отляво надясно и форматните кодове се съпоставят в ред с аргументите които включва списъка със аргументи . Празните символи във форматния низ предизвикват scanf ( ) да прескача през един или повече празни символа във входния поток . Празния символ е или интервал или табулация или нов ред . Всъщност един празен символ в контролния низ ще предизвика scanf ( ) да прочете но да не запази никакво число ( включително 0 ) от празните символи до първия непразен символ . Непразен символ във форматния низ предизвиква scanf ( ) да прочете и да отхвърли съответния символ . Например %d , %d предизвиква scanf ( ) първо да прочете integer , след това да прочете и да отхвърли запетайката и накрая да прочете друго integer . Ако определения символ не е открит , scanf ( ) ще прекъсне . Всички променливи използвани да получават стойности чрез scanf ( ) трябва да са подадени по адрес . Това значи че всички аргументи трябва да бъдат указатели към променливите получаващи вход . Обектите от данни осъществяващи вход трябва да бъдат разделени чрез интервали , табулации или нови редове . Пунктуациите като запетайки , точки и запетайки и други като тях не се броят като разделители . Това означава че :

scanf ( “ %d%d “ , &r , &c ) ;

ще приеме вход 10 20 но ще пропадне със 10 , 20 . * поставен след % и преди форматния код ще прочете данните от определения тип но ще подтисне присвояванията им . Така следната команда :

scanf ( “ %d %* c %d “ , &x , &y ) ;

при подаден вход 10/20 ще постави стойност 10 в x , ще отхвърли знака за деление и ще даде на y стойност 20 . Форматните команди могат да определят модификатора за максимална дължина на полето . Това е число поставено между % и форматния код който ограничава броя на символите прочетени за всяко поле . Например , ако искате да прочетете не повече от 20 символа в address , тогава ще трябва да напишете :

scanf ( “%20s “ , address ) ;

Ако входния поток има повече от 20 символа , следващото извикване на входа ще започне от там където е прекъснало . Вход за поле може да прекъсне преди достигане на максималната дължина на полето ако се срещне празен интервал . В този случай , scanf ( ) се премества на следващото поле . Въпреки че интервалите , табулациите и новите редове се използват като разделители за полета , когато четем единичен символ , те се четат като всеки друг символ . Например със входен поток x , y



scanf ( “ %c%c%c “ , &a , &b , &c ) ;

ще върне символ x във а , интервал във b и символ у във с . Внимавайте всеки друг символ в контролния низ , включително интервали , табулации и нови редове , ще бъде използван за съпоставяне и отхвърляне на символи от входния поток . Всеки символ който се срещне ще бъде отхвърлен . Например , подавайки на входния поток 10t20 ,



scanf ( “%st%s “ , &x , &y ) ;

ще постави 10 в х и 20 в у . t ще се отхвърли понеже t е в контролния низ . Друга черта на scanf ( ) e наречена множество за сканиране . Множеството дефинира множество от символи които могат да бъдат прочетени от scanf ( ) и присвоени на съответствуващия символен масив . Множеството за сканиране е дефинирано чрез поставяне на символите които искате да сканирате вътре в квадратни скоби . Началната скоба трябва да има префикс % . Например , това множество за сканиране казва на на scanf ( ) да чете само символите A , B и C :



%[ABC]

Когато е използвано множество за сканиране scanf ( ) продължава да чете символи и да ги слага в съответствуващия символен масив докато не срещне символ който не е в множеството . Съответната променлива трябва да бъде указател към символен масив . След връщане на scanf ( ) масива ще съдържа нулево – терминиран низ състоящ се от прочетените символи . Можете да обърнете множеството ако първия символ в множеството е ^ . Когато е подаден ^ , той информира scanf ( ) да приеме всеки символ който не е дефиниран в множеството . Вие можете да определите област използвайки тире ( - ) . Например , това казва на scanf ( ) да приеме символите от А до Z :



%[ A-Z]

Важно е да запомните че множеството за сканиране е прецизен случай . По тази причина ако искате да сканирате и за големи и за малки букви , те трябва да бъдат определени поотделно . Функцията scanf ( ) връща число равно на броя на полетата със успешно присвоени стойности . Този брой включва полетата които са прочетени но не са присвоени защото * ограничителя е използван да забрани присвояването . EOF се връща ако стане грешка преди първото поле да е присвоено . Свързани функции са printf ( ) и fscanf ( ) .


setbuf ( )


# include < stdio . h >

void setbuf ( FILE *stream , char *buf ) ;

Функцията setbuf ( ) се използва или да определи буфера който ще използва определения поток или ако е извикана със установен buf на 0 , ще изключи буферирането . Ако дефинирания от програмиста буфер е бил определен , той трябва да бъде BUFSIZE символа дълъг . BUFSIZE е дефиниран в STDIO .H . Функцията setbuf ( ) не връща стойност . Свързани функции са fopen ( ) , fclose ( ) и setvbuf ( ) .


setvbuf ( )


# include < stdio . h >

int setvbuf ( FILE *stream , char *buf , int mode ,

size_t size ) ;

Функцията setvbuf ( ) позволява на програмиста да определи буфера , неговата големина , и режима за определения поток . Символния масив указван от buf се използва като поточния буфер за I/O операции . Големината на буфера се определя от size , a mode определя как ще бъде манипулирано буферирането . Ако buf e 0 , setvbuf ( ) ще отдели собствен буфер . Позволените стойности на mode са _IOFBF , _IONBF и _IOLBF . Те са дефинирани в STDIO . H . Когато mode е установено на _IOFBF ще има пълно буфериране . Ако mode e _IOLBF , потока ще бъде буфериран по редове , което означава че буфера ще бъде записван всеки път когато се срещне символ за нов ред във изходния поток , за входен поток , входа изисква прочитането на всички символи до новия ред . Във всеки случай буфера се записва когато се напълни . Ако режима е _IONBF няма буфериране . Стойноста на size тръбва да бъде по – голяма от 0 . Функцията setvbuf ( ) връща 0 при успех и ненула при срив . Свързана функция е setbuf ( ) .


sprintf ( )


# include < stdio . h >

int sprintf ( char *buf , const char *format , . . . ) ;

Функцията sprintf ( ) е идентична на printf ( ) с изключение на изхода който се слага в масив указван от buf , вместо да бъде записан на конзолата . Виж printf ( ) за детайли . Върнатата стойност е равна на броя символи действително поставени в масива . Свързани функции са printf ( ) и fsprintf ( ) .


sscanf ( )


# include < stdio . h >

int sscanf ( const char *buf , const char *format , . . . ) ;

Функцията sscanf ( ) е идентична на scanf ( ) с изключение на това че данните се четат от масив указван от buf , а не от stdin . Виж scanf ( ) за детайли . Връщаната стойност е равна на броя променливи със действително присвоени стойности . Този брой не включва полетата които са били прескочени чрез употребата на * ограничител . Стойност 0 значи че няма присвоено поле , а EOF показва че е станала грешка при първото присвояване . Свързани функции са scanf ( ) и fscanf ( ) .


tmpfile ( )


# include < stdio . h >

FILE *tmpfile ( void ) ;

Функцията tmpfile ( ) отваря временен файл за обновяване и връща указател към потока . Функцията автоматично използва уникално файлово име за да избегне конфликти с имената на сществуващи файлове . Функцията tmpfile ( ) връща нулев указател при срив , в противен случай връща указател към потока . Временния файл създаден чрез tmpfile ( ) се премахва автоматично когато файла се затвори или програмата се прекъсне . Свързана функция е tmpnam ( )


tmpnam( )


# include < stdio . h >

char *tmpnam ( char *name ) ;

Функцията tmpnam ( ) генерира уникално файлово име и го съхраянява в масив указван от name . Главната задача на tmpnam ( ) е да генерира временно файлово име което е различно от другите в текущата дискова директория . Функцията може да бъде извикана TMP_MAX пъти . TMP_MAX е дефиниран в STDIO .H и ще бъде не по – малко от 25 . Всеки път когато tmpnam ( ) е извикана , тя ще генерира ново временно файлово име . Указател към name се връща при успех , в противен случай се връща нулев указател . Свързана функция е tmpfile ( ) .


ungetc ( )


# include < stdio . h >

int ungetc ( int ch , FILE *stream ) ;

Функцията ungetc ( ) връща символа определен от нискоразредния байт на ch във входния поток stream . Този символ ще бъде получен чрез следващата операция за четене в stream . Извикването на fflush ( ) или fseek ( ) премахва ungetc ( ) операцията . и отхвърля символа . Едносимволно връщане е гарантирано , обаче някой изпълнения ще допуснат повече . Вие не може да не получите EOF . Извикването на ungetc ( ) изчиства флага за край на файла свързан със определения поток . Стойността на позициониращия индикатор за текстови поток е неопределена докато всички сложени отзад символи са прочетени в който случай то ще е същото като след първото ungetc ( ) извикване . За двоични потоци , всяко ungetc ( ) извикване намалява позициониращия файлов индикатор . Връщаната стойност е равна на ch при успех и EOF при срив . Свързана функция е getc ( ) .


vprintf ( ) , vfprintf ( ) и vsprintf ( )


# include < stdarg . h >

# include < stdio . h >

int vprintf ( char *format , va_list arg_ptr ) ;

int vfprintf ( FILE *stream , const char *format , va_list

arg_ptr ) ;

int vsprintf ( char *buf , char *format ,va_list arg_ptr ) ;

Функциите vprintf ( ) , vfprintf ( ) и vsprintf ( ) са функционално еквивалентни съответно на printf ( ) , fprintf ( ) и sprintf ( ) с изключение на списъка със аргументи който ще е заместен с указател към списък с аргументи . Този указател трябва да бъде от тип va_list и е дефиниран в STDARG . H . Свързани функции са va_arg ( ) , va_start ( ) и va_end( ) .




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


Сподели с приятели:
1   2   3   4   5   6   7   8   9   10   ...   19




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

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