Б. Керриган, Д. Ритчи Язык программирования C. Б. Керниган, Д. зык программирования и . Издание 3е, исправленное Перевод с английского под редакцией Вс. С. Штаркмана СанктПетербург 2003
Скачать 31.48 Mb.
|
312 В. Стандартная библиотека запоминает строку в s и возвращает ее в качестве значения функ- ции; длина s должна быть не менее При каждом вызове гене- рируется новое имя; при этом гарантируется не более различных имен за один сеанс работы программы. Заметим, что tmpnam создает имя, а не файл. setvbuf(FILE char *buf, int mode, size_t size) управляет буферизацией потока; к ней следует обращаться прежде, чем будет выполняться чтение, запись или какая-либо другая mode со значением вызывает полную буферизацию, с _IOLBF - "построчную" буферизацию текстового файла, a mode со значением _IONBF отменяет всякую буферизацию. Если параметр buf не есть NULL, то его значение - указатель на бу- фер, в противном случае под буфер будет запрашиваться память. Параметр size задает размер буфера. Функция setvbuf в случае ошибки выдает ненуле- вое значение. void char *buf) Если buf есть NULL, то для потока stream буферизация выключается. В против- ном случае вызов setbuf приведет к тем же действиям, что и вызов (void) setvbuf (stream, b u f , BUFSIZ). В Форматный вывод Функции осуществляют вывод информации по формату. int fprintf(FILE const char f p r i n t f преобразует и пишет вывод в поток stream под управлением f o r m a t . Возвращаемое значение - число записанных символов или, в случае ошибки, отрицательное значение. Форматная строка содержит два вида объектов: обычные символы, ко- пируемые в выводной поток, и спецификации преобразования, которые вызывают преобразование и печать остальных аргументов в том поряд- ке, как они перечислены. Каждая спецификация преобразования начи- нается с % и заканчивается символом-спецификатором преобразования. Между % и символом-спецификатором в порядке, в котором они здесь пе- речислены, могут быть расположены следующие элементы информации: • Флаги (в любом порядке), модифицирующие спецификацию: - указывает на то, что преобразованный аргумент должен быть прижат к левому краю поля; + - предписывает печатать число всегда со знаком; пробел - если первый символ - не знак, то числу должен предшествовать пробел; О - указывает, что числа должны дополняться слева нулями до всей ширины поля; - указывает из форм вывода: о первой циф- рой должен быть 0; для х или X ненулевому результату долж- ны предшествовать Ох или ОХ; для е, Е, f, g и G вывод должен В Ввод-вывод: 313 обязательно содержать десятичную точку; для g и 6 заверша- ющие нули не отбрасываются. • Число, специфицирующее минимальную ширину поля. Преобразованный аргумент будет напечатан в поле, размер которого не меньше указанной ши- рины, а если потребуется, в поле большего размера. Если число символов преобразованного аргумента меньше ширины то поле будет дополне- но слева (или справа, если число прижимается к левому краю). Обычно поле дополняется пробелами (или нулями, если присутствует флаг дополнения нулями). • Точка, отделяющая указатель ширины поля от указателя точности. • Число, задающее точность, которое специфицирует максимальное количе- ство символов, печатаемых из строки, или количество цифр после десятич- ной точки в преобразованиях е, Е или или количество значащих цифр для g или G-преобразования, или минимальное количество цифр при печати целого (до необходимой ширины поля число дополняется слева нулями). • Модификаторы h, 1 (буква ell) или указывает на то, что соответству- ющий аргумент должен печататься как short или unsigned short; "1" со- общает, что аргумент имеет тип long или unsigned long; информирует, что аргумент принадлежит типу long double. Ширина, или точность, или обе эти характеристики могут быть специфи- цированы с помощью в этом случае необходимое число "извлекается" из следующего который должен иметь тип (в случае двух звездочек используются два аргумента). Символы-спецификаторы и разъяснение их смысла приведены в таб- лице Если за % нет правильного символа-спецификатора, результат не определен. int printf(const char полностью эквивалентна int *s, const char ...) s p r i n t f действует так же, как и p r i n t f , только вывод осуществляет в строку s, завершая ее символом ' Строка s должна быть достаточно большой, чтобы вмещать результат вывода. Возвращает количество записанных символов, в число которых символ ' не входит. int vprintf (const char arg) int vfprintf (FILE const char va_list arg) int vsprintf (char const char va_list arg) Функции и эквивалентны соответствующим функциям с той лишь разницей, что переменный список аргументов представ- лен параметром arg, инициализированным макросом и, возможно, вызовами va_arg (см. в В7 описание 314 Приложение В. Стандартная библиотека Таблица Преобразования printf Символ Тип аргумента; вид печати i знаковая десятичная запись о int; беззнаковая восьмеричная запись (без 0 слева) х, X unsigned Ох или ОХ слева), в качестве цифр от 10 до 15 используются для х и A8CDEF для X int; беззнаковое десятичное целое с int; единичный символ после преобразования в unsigned s char *; символы строки печатаются, пока не встретится ' или не исчерпается количество символов, указанное точ- ностью f double; десятичная запись вида где количество d специфицируется точностью. По умолчанию точность равна 6; нулевая точность подавляет печать десятичной точки Е запись вида где количество d специфицирует- ся точностью. По умолчанию точность равна 6; нулевая точность подавляет печать десятичной точки g, G double; используется %е и если порядок меньше -4 или больше или равен точности; в противном случае исполь- зуется Завершающие нули и точка в конце не печата- ются р void *; печатает в виде указателя (представление зависит от реализации) n int число символов, напечатанных к данному моменту дан- ным вызовом p r i n t f , записывается в аргумент. Никакие другие аргументы не преобразуются % никакие аргументы не преобразуются; печатается % В 1.3. Форматный ввод Функции scanf имеют дело с форматным преобразованием при вводе. int fscanf(FILE const char читает данные из потока st ream под управлением f о и ные величины присваивает по порядку аргументам, каждый из которых дол- жен быть указателем. Завершает работу, если исчерпался формат. Выдает EOF В Ввод-вывод: 315 по исчерпании файла или перед любым преобразованием, если возникла ошиб- ка; в остальных случаях функция возвращает количество преобразованных и введенных элементов. Форматная строка обычно содержит спецификации преобразования, которые используются для управления вводом. В форматную строку мо- гут входить: • пробелы и табуляции, которые игнорируются; • обычные символы (кроме которые ожидаются в потоке ввода среди сим- волов, отличных от символов-разделителей; • спецификации преобразования, состоящие из %; необязательного знака *, подавляющего присваивание; необязательного числа, специфицирующего максимальную ширину поля; необязательных h, 1 или L, указывающих раз- мер присваиваемого значения, и символа-спецификатора преобразования. Спецификация преобразования определяет преобразование следующе- го поля ввода. Обычно результат размещается в переменной, на которую указывает соответствующий аргумент. Однако если присваивание подав- ляется с помощью знака как, например, в то поле ввода просто про- пускается, и никакого присваивания не происходит. Поле ввода опреде- ляется как строка символов, отличных от символов-разделителей; при этом ввод строки прекращается при выполнении любого из двух усло- вий: если встретился символ-разделитель или если ширина поля (в слу- чае, когда она указана) исчерпана. Из этого следует, что при переходе к следующему полю может "перешагивать" через границы строк, по- скольку символ новой строки является символом-разделителем. (Под сим- волами-разделителями понимаются символы пробела, табуляции, новой строки, возврата каретки, вертикальной табуляции и смены страницы.) Символ-спецификатор указывает на способ интерпретации поля вво- да. Соответствующий аргумент должен быть указателем. Список допус- тимых символов-спецификаторов приводится в таблице В-2. Символам-спецификаторам d, о, и х может предшествовать h, если аргумент есть указатель на short (а не или 1 (буква ell), если аргу- мент есть указатель на long. Символам-спецификаторам е, f и g может предшествовать 1, если аргумент - указатель на double (а не или если аргумент - указатель на long double. int (const char (...) делает то же, и f s c a n f int sscanf (const char *s, const char . . . ) sscanf делает то же, что и s c a n f (...), только ввод символов осуществляет из строки s. .. , 316 Приложение В. Стандартная библиотека Таблица В-2. Преобразования Символ Данные на вводе; тип аргумента d десятичное целое; int * i целое; *. Целое может быть восьмеричным (с нулем сле- ва) или (с Ох или ОХ слева) о восьмеричное целое (с нулем слева или без него); int * и беззнаковое десятичное целое; u n s i g n e d int * х целое (с Ох или ОХ слева или без них); int * с символы; *. Символы ввода размещаются в указанном массиве в количестве, заданном шириной поля; по умол- чанию это количество равно 1. Символ ' не добавляет- ся. Символы-разделители здесь рассматриваются как обычные символы и поступают в аргумент. Чтобы про- честь следующий символ-разделитель, используйте %1s s строка символов, отличных от символов-разделителей (за- писывается без кавычек); указывающий на массив размера достаточного, чтобы вместить строку и добавля- емый к ней символ ' е, g число с плавающей точкой; *. Формат ввода для состоит из необязательного знака, строки цифр, возмож- но с десятичной точкой, и необязательного порядка, со- стоящего из Е или е и возможно со знаком р значение указателя в виде, в котором f его на- печатает; void * п записывает в аргумент число символов, прочитанных к это- му моменту в этом вызове; int *. Никакого чтения ввода не происходит. Счетчик числа введенных элементов не увеличивается [...] выбирает из ввода самую длинную непустую строку, состоя- щую из символов, заданных в квадратных скобках; char *. В конец строки добавляется ' Спецификатор вида включает ] в задаваемое множество символов выбирает из ввода самую длинную непустую строку, состо- ящую из символов, не входящих в заданное в скобках мно- жество. В конец добавляется Спецификатор вида ] включает ] в задаваемое множество символов % обычный символ %; присваивание не делается В 1. Ввод-вывод: 317 В Функции ввода-вывода символов int fgetc(FILE f getc возвращает следующий символ из потока st ream в виде unsigned char (пе- реведенную в int) или если исчерпан файл или обнаружена ошибка. char *fgets(char *s, int n, FILE f gets читает не более символов в массив s, прекращая чтение, если встре- тился символ новой строки, который включается в массив; кроме того, запи- сывает в массив Функция fgets возвращает s или, если исчерпан файл или обнаружена ошибка, NULL. int с, FILE f пишет символ с (переведенный в unsigned char) в stream. Возвращает за- писанный символ или EOF в случае ошибки. int char *s, FILE f puts пишет строку s (которая может не иметь ' в stream; возвращает нео- трицательное целое или EOF в случае ошибки. int getc(FILE getc делает то же, что и fgetc, но в отличие от последней, если она - макрос, может браться более одного раза. int getchar(void) делает то же, что char *gets(char *s) gets читает следующую строку ввода в массив s, заменяя символ новой строки на ' Возвращает s или, если исчерпан файл или обнаружена ошибка, NULL. int с, FILE putc делает то же, что и f putc, но в отличие от последней, если putc - макрос, значение st ream может браться более одного раза. int putchar(int с) делает то же, что putc(c, stdout). int puts(const char *s) puts пишет строку s и символ новой строки в stdout. Возвращает EOF в случае ошибки, или неотрицательное значение, если запись прошла нормально. int ungetc(int с, FILE ungetc отправляет символ с (переведенный в unsigned char) обратно в stream; 318 Приложение В. Стандартная библиотека при следующем чтении из st он будет получен снова. Для каждого потока вернуть можно не более одного символа. Нельзя возвращать EOF. В качестве результата выдает отправленный назад символ или, в случае ошибки, EOF. В Функции прямого ввода-вывода size_t *ptr, size_t size, size_t FILE f read читает из потока st ream в массив не более nobj объектов размера size. Она возвращает количество прочитанных объектов, которое может быть мень- ше заявленного. Для индикации состояния после чтения следует использовать feof и ferror. size_t fwrite(const void *ptr, size_t size, size_t n o b j , FILE write пишет из массива ptr в nobj объектов размера size; возвращает число записанных объектов, которое в случае ошибки меньше В Функции позиционирования файла int fseek(FILE long offset, int origin) устанавливает позицию для последующее чтение или запись бу- дет производиться с этой позиции. В случае бинарного файла позиция уста- навливается со смещением - относительно начала, если o r i g i n равен SEEK_SET; относительно текущей позиции, если o r i g i n равен и отно- сительно конца файла, если origin равен SEEK_END. Для текстового файла должен быть нулем или значением, полученным с помощью вызова функции При работе с текстовым файлом o r i g i n всегда должен быть равен SEEK_SET. long ftell(FILE ftell возвращает текущую позицию потока или в случае void rewind (fp) делает то же, что и fseek(fp, OL, clearerr(fp). int fgetpos(FILE fpos_t *ptr) f get pos записывает текущую позицию потока st ream в * pt для последующего использования ее в setpos. Тип позволяет хранить такого рода значе- ния. В случае ошибки f pos возвращает ненулевое значение. int fsetpos(FILE const fpos_t *ptr) pos устанавливает позицию в читая ее из куда она была запи- сана ранее с помощью fgetpos. В случае ошибки f setpos возвращает ненулевое значение. В 2. Проверки класса символа: 319 В Функции обработки ошибок Многие функции библиотеки в случае ошибки или конца файла уста- навливают индикаторы состояния. Эти индикаторы можно проверять и изменять. того, целое (объявленное в может содержать номер ошибки, который дает дополнительную инфор- мацию о последней из обнаруженных ошибок. void очищает индикаторы конца файла и ошибки потока int feof(FILE возвращает ненулевое значение, если для потока st ream установлен ин- дикатор конца файла. int ferror(FILE возвращает ненулевое значение, если для потока stream установлен индикатор ошибки. void perror(const char *s) perror(s) печатает s и зависимое от реализации сообщение об ошибке, со- ответствующее целому значению в т. е. делает то же, что и обращение к функции f f вида s, сообщение См. в параграфе ВЗ. В 2. Проверки класса символа: Заголовочный файл объявляет функции, предназначенные для проверок символов. Аргумент каждой из них имеет тип int и должен либо представлять собой EOF, либо быть значением unsigned c h a r , приве- денным к int; возвращаемое значение тоже имеет тип int. Функции воз- вращают ненулевое значение ("истина"), когда аргумент с удовлетворяет описанному условию или принадлежит указанному классу символов, и нуль в противном случае. - isdiglt (с) истина isalpha(c) - islower(c) есть истина - управляющий символ isdigit(c) - десятичная цифра - печатаемый символ кроме пробела - буква нижнего регистра isprint(c) - печатаемый символ, включая пробел - печатаемый символ кроме пробела, буквы или цифры 320 Приложение В. Стандартная библиотека isspace(c) - пробел, смена страницы, новая строка, возврат каретки, табуляция, вертикальная табуляция isupper(c) - буква верхнего регистра isxdigit(c) - В наборе семибитовых ASCII-символов печатаемые символы находятся в диапазоне от 0x20 (' ' ) до Ох7Е ); символы - от О (NUL) до 0x1 F (US) и Ox7F (DEL). Помимо перечисленных есть две функции, приводящие буквы к одно- му из регистров: int tolower(int с) - переводит с на нижний регистр; int с) - переводит с на верхний регистр. Если с - буква на верхнем регистре, то выдаст эту букву на ниж- нем регистре; в противном случае она вернет с. Если с - буква на нижнем регистре, то toupper( с) выдаст эту букву на верхнем регистре; в против- ном случае она вернет с. В 3. Функции, оперирующие со строками: h> Имеются две группы функций, оперирующих со строками. Они опре- делены в заголовочном файле за исключением поведение функций не определено. Функции сравнения рассматривают аргументы как массивы элементов типа unsigned В таблице на с. s и t типу c h a r - типу const char *, n - типу а с - значение типа int, приведенное типу char. Последовательные вызовы st rtok разбивают строку s на лексемы. Огра- ничителем лексемы служит любой символ из строки ct. В первом вызове указатель s не равен NULL. Функция находит в строке s первую лексему, состоящую из символов, не входящих в ct; ее работа заканчивается тем, что поверх следующего символа пишется ' и возвращается указатель на лексему. Каждый последующий вызов, в котором указатель s равен NULL, возвращает указатель на следующую лексему, которую функция будет искать сразу за концом предыдущей. Функция возвращает NULL, если далее никакой лексемы не обнаружено. Параметр ct от вызова к вызову может варьироваться. Функции mem... предназначены для манипулирования с объектами с мас- сивами символов; их назначение - получить интерфейсы к эффективным |