Язык программирования Си. Издание 3-е, исправленное - Брайан Керниган
Шрифт:
Интервал:
Закладка:
B1.4. Функции ввода-вывода символов
int fgetc(FILE *stream);
fgetc возвращает следующий символ из потока stream в виде unsigned char (переведенную в int) или EOF, если исчерпан файл или обнаружена ошибка.
char *fgets(char *s, int n, FILE *stream);
fgets читает не более n-1 символов в массив s, прекращая чтение, если встретился символ новой строки, который включается в массив; кроме того, записывает в массив ' '. Функция fgets возвращает s или, если исчерпан файл или обнаружена ошибка, NULL.
int fputc(int с, FILE *stream);
fputc пишет символ c (переведенный в unsigned char) в stream. Возвращает записанный символ или EOF в случае ошибки.
int fputs(const char *s, FILE *stream);
fputs пишет строку s (которая может не иметь 'n' ) в stream; возвращает неотрицательное целое или EOF в случае ошибки.
int getc(FILE *stream);
getc делает то же, что и fgetc, но в отличие от последней, если она - макрос, stream может браться более одного раза.
int getchar(void);
getchar() делает то же, что getc(stdin).
char *gets(char *s);
gets читает следующую строку ввода в массив s, заменяя символ новой строки на ' '. Возвращает s или, если исчерпан файл или обнаружена ошибка, NULL.
int putc(int с, FILE *stream);
putc делает то же, что и fputc, но в отличие от последней, если putc - макрос, значение stream может браться более одного раза.
int putchar(int c);
putchar(c) делает тоже, что putc(c, stdout).
int puts(const char *s);
puts пишет строку s и символ новой строки в stdout. Возвращает EOF в случае ошибки, или неотрицательное значение, если запись прошла нормально.
int ungetc(int с, FILE *stream);
ungetc отправляет символ c (переведенный в unsigned char) обратно в stream; при следующем чтении из stream он будет получен снова. Для каждого потока вернуть можно не более одного символа. Нельзя возвращать EOF. В качестве результата ungetc выдает отправленный назад символ или, в случае ошибки, EOF.
B1.5. Функции прямого ввода-вывода
size_t fread(void *ptr, size_t size, size_t nobj, FILE *stream);
fread читает из потока stream в массив ptr не более nobj объектов размера size. Она возвращает количество прочитанных объектов, которое может быть меньше заявленного. Для индикации состояния после чтения следует использовать feof и ferror.
size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *stream);
fwrite пишет из массива ptr в stream nobj объектов размера size; возвращает число записанных объектов, которое в случае ошибки меньше nobj.
B1.6. Функции позиционирования файла
int fseek(FILE *stream, long offset, int origin);
fseek устанавливает позицию для stream; последующее чтение или запись будет производиться с этой позиции. В случае бинарного файла позиция устанавливается со смещением offset - относительно начала, если origin равен SEEK_SET; относительно текущей позиции, если origin равен SEEK_CUR; и относительно конца файла, если origin равен SEEK_END. Для текстового файла offset должен быть нулем или значением, полученным с помощью вызова функции ftell. При работе с текстовым файлом origin всегда должен быть равен SEEK_SET.
long ftell(FILE *stream);
ftell возвращает текущую позицию потока stream или -1L, в случае ошибки.
void rewind(FILE *stream);
rewind(fp) делает то же, что и fseek(fp, 0L, SEEK_SET); clearerr(fp).
int fgetpos(FILE *stream, fpos_t *ptr);
fgetpos записывает текущую позицию потока stream в *ptr для последующего использования ее в fsetpos. Тип fpos_t позволяет хранить такого рода значения, В случае ошибки fgetpos возвращает ненулевое значение.
int fsetpos(FILE *stream, const fpos_t *ptr);
fsetpos устанавливает позицию в stream, читая ее из *ptr, куда она была записана ранее с помощью fgetpos. В случае ошибки fsetpos возвращает ненулевое значение.
B1.7. Функции обработки ошибок
Многие функции библиотеки в случае ошибки или конца файла устанавливают индикаторы состояния. Эти индикаторы можно проверять и изменять. Кроме того, целое выражение errno (объявленное в <errno.h>) может содержать номер ошибки, который дает дополнительную информацию о последней из обнаруженных ошибок.
void clearerr(FILE *stream);
clearerr очищает индикаторы конца файла и ошибки потока stream.
int feof(FILE *stream);
feof возвращает ненулевое значение, если для потока stream установлен индикатор конца файла.
int ferror(FILE *stream);
ferror возвращает ненулевое значение, если для потока stream установлен индикатор ошибки.
void perror(const char *s);
perror(s) печатает s и зависимое от реализации сообщение об ошибке, соответствующее целому значению в errno, т. е. делает то же, что и обращение к функции fprintf вида
fprintf(stderr, "%s: %sn", s, "сообщение об ошибке")
См. strerror в параграфе B3.
B2. Проверки класса символа: ‹ctype.h›
Заголовочный файл <ctype.h> объявляет функции, предназначенные для проверок символов. Аргумент каждой из них имеет тип int и должен либо представлять собой EOF, либо быть значением unsigned char, приведенным к int; возвращаемое значение тоже имеет тип int. Функции возвращают ненулевое значение ("истина"), когда аргумент c удовлетворяет описанному условию или принадлежит указанному классу символов, и нуль в противном случае.
isalnum(c) isalpha(c) или isdigit(c) есть истина isalpha(c) isupper(c) или islower(c) есть истина iscntrl(c) управляющий символ isdigit(c) десятичная цифра isgraph(c) печатаемый символ кроме пробела islower(c) буква нижнего регистра isprint(c) печатаемый символ, включая пробел ispunct(c) печатаемый символ кроме пробела, буквы или цифры isspace(c) пробел, смена страницы, новая строка, возврат каретки, табуляция, вертикальная табуляция isupper(c) буква верхнего регистра isxdigit(c) шестнадцатеричная цифраВ наборе семибитовых ASCII-символов печатаемые символы находятся в диапазоне от 0x20 (' ') до 0x7E ('~'); управляющие символы - от 0 (NUL) до 0x1F (US) и 0x7F (DEL).
Помимо перечисленных есть две функции, приводящие буквы к одному из регистров:
int tolower(int c) – переводит c на нижний регистр;
int toupper(int c) - переводит c на верхний регистр.
Если c - буква на верхнем регистре, то tolower(c) выдаст эту букву на нижнем регистре; в противном случае она вернет c. Если c - буква на нижнем регистре, то toupper(c) выдаст эту букву на верхнем регистре; в противном случае она вернет c.
B3. Функции, оперирующие со строками: <string.h>
Имеются две группы функций, оперирующих со строками. Они определены в заголовочном файле <string.h>. Имена функций первой группы начинаются с букв str, второй - с mem. Если копирование имеет дело с объектами, перекрывающимися по памяти, то, за исключением memmove, поведение функций не определено. Функции сравнения рассматривают аргументы как массивы элементов типа unsigned char.
В таблице на с. 321 переменные s и t принадлежат типу char *, cs и ct – типу const char *, n - типу size_t, а c - значение типа int, приведенное к типу char.
Последовательные вызовы strtok разбивают строку s на лексемы. Ограничителем лексемы служит любой символ из строки ct. В первом вызове указатель s не равен NULL. Функция находит в строке s первую лексему, состоящую из символов, не входящих в ct; ее работа заканчивается тем, что поверх следующего символа пишется ' ' и возвращается указатель на лексему. Каждый последующий вызов, в котором указатель s равен NULL, возвращает указатель на следующую лексему, которую функция будет искать сразу за концом предыдущей. Функция strtok возвращает NULL, если далее никакой лексемы не обнаружено. Параметр ct от вызова к вызову может варьироваться.