• Название:

    Бочков С. О., Субботин Д. М. Язык программиро...

  • Размер: 0.5 Мб
  • Формат: PDF
  • или
  • Название: ЧАСТЬ II
  • Автор: Хозяин

ЧАСТЬ II
СТАНДАРТНАЯ БИБЛИОТЕКА ЯЗЫКА СИ
В языке Си стандартная библиотека более сильно интегрирована с языком по
сравнению с другими языками программирования высокого уровня. Без использования
функций стандартной библиотеки не может быть написана ни одна серьезная программа на
языке Си, в частности потому, что в самом языке Си нет никаких средств ввода/вывода
информации.
Стандартную библиотеку функций языка Си можно разделить на две категории:
функции, которые имеются в библиотеке любой системы программирования языка Си для
различных операционных систем и различных архитектур компьютеров, и функции, которые
являются уникальными в рамках какой-либо системы программирования, или обеспечивают
доступ к специфическим возможностям конкретной операционной системы, или связаны с
конкретной архитектурой компьютера.
Функции первой категории образуют переносимое ядро библиотеки; программы, в
которых используются только такие библиотечные функции, могут быть перенесены в
другую систему программирования, другую операционную систему и/или на другой тип
архитектуры компьютеров с наименьшими затратами. Плата за универсальность и
переносимость

невозможность
воспользоваться
специфическими
средствами,
предоставляемыми конкретной вычислительной средой.
Функции второй категории предоставляют возможность получить доступ к функциям
ядра данной операционной системы, к внутренним структурам данных операционной
системы, к регистрам используемых аппаратных устройств. Кроме того, ко второй
категории относятся функции, которые добавлены в библиотеку, исходя из вкусовых
привязанностей разработчиков конкретной системы программирования — как им видится
удобный набор средств для разработки различных алгоритмов (сравните, например,
функции setmem и memset). В современных системах программирования Си в рамках общей
тенденции к стандартизации такие необоснованные расширения библиотек сокращаются, но
в ранних системах программирования разнобой был крайне высок.
К сожалению, наборы функций второй категории не согласованы даже для различных
систем программирования в рамках одной операционной системы на одном типе архитектур
компьютеров. Четко прослеживается это и на примере систем программирования ТС и MSC.
Библиотечные функции, обеспечивающие интерфейс для вызова одной и той же функции
операционной системы, могут иметь не только разные параметры, но и разные названия.
Эти несогласованности объясняются, с одной стороны, коммерческими соображениями
— стремлением удержать под контролем рынок программного обеспечения, чтобы
пользователи,
начавшие
программировать
с
использованием
одной
системы
программирования, покупали затем более новые программные продукты той же фирмы, а с
другой стороны, поздним появлением стандарта на язык и на его библиотеку и
независимости эволюции от версии к версии каждой системы программирования. При этом,
надо отметить, происходит постепенное сближение различных систем программирования по
мере того, как каждая из них заимствует наиболее ценные идеи у конкурентов. Так,
различия между библиотеками более поздних версий систем программирования MSC и ТС
отчасти сокращены по сравнению с первыми версиями.
Данную часть книги следует рассматривать в первую очередь как справочник по
стандартной библиотеке языка Си двух систем программирования — MSC и ТС — для
компьютеров типа IBM PC. Она также будет полезна для разработчиков новых систем
программирования Си, поскольку в ней проводится сравнение реализации различных
библиотечных функций двух широко распространенных систем программирования.
Из-за ограничений по объему в книгу не вошло описание специальных графических
библиотек Си систем программирования MSC и ТС.
Структура описания библиотеки такова: сначала дается краткое описание различных
групп функций и вводятся основные понятия, используемые далее при описании
библиотечных функций. Затем приводится полное описание всех функций в алфавитном
порядке.
Предпринята попытка дать детальное описание библиотечных функций, приводится
описание
используемых
констант,
как
они
описываются

помощью
директивы
препроцессора #define) во включаемых файлах.
Авторы считают, что для эффективной разработки качественного программного
обеспечения на языке Си программист должен представлять нижний уровень реализации
языка и его стандартной библиотеки. Поэтому иногда дается описание деталей (в
частности, связанных с использованием системных вызовов ОС и имен типов, введенных с
помощью конструкции typedef), которые часто сознательно замалчиваются в документации
по библиотекам.

По нашему мнению, пользователь должен обладать полной информацией, осознавая при
этом, с какими проблемами он столкнется при переносе программ в новую версию системы
программирования, в новую операционную систему или на компьютер другой архитектуры.
Обозначение ANSI, используемое в полном описании библиотеки, указывает, что
отмеченная библиотечная функция включена в стандарт языка Си.

9 КРАТКОЕ ОПИСАНИЕ БИБЛИОТЕКИ
Ниже приводится краткое описание основных групп функций для быстрой ориентации в
библиотеке. При этом вводятся основные понятия, используемые при описании
библиотечных функций (в частности, связанные с организацией ввода/вывода). Также
указывается, в каком стандартном включаемом (по директиве препроцессора #include)
файле содержится описание прототипа функции, относящихся к ней структур данных и
констант.

9.1

Работа с областями памяти и строками

В стандартной библиотеке есть специальная группа Функций для обработки областей
памяти, которые рассматриваются как последовательности байтов.
Если размер области, с которой необходимо работать, задается явно, будем
называть такую область буфером.
Другое используемое понятие — строка. Отличие строки от буфера в том, что ее
размер задается не явно, а определяется первым встретившимся при просмотре строки
слева направо нулевым байтом (имеющим значение '\0'), причем считается, что этот
нулевой байт также принадлежит строке.
Для копирования буферов, для присваивания каждому байту в пределах указанного
буфера заданного значения и для сравнения содержимого двух буферов предназначены
следующие функции:
Функция
Краткое описание
memccpy
копирует символы из одного буфера в другой до тех пор, пока не будет
скопирован заданный символ или не будет скопировано определенное число
символов
memchr
возвращает указатель на первое вхождение заданного символа в буфере
memcmp
сравнивает указанное число символов из двух буферов
memlcmp
сравнивает указанное число символов двух буферов, считая строчные и
прописные буквы эквивалентными
memcpy
копирует указанное количество символов из одного буфера в другой
memset
инициализирует заданным значением указанное количество байтов в буфере
movedata копирует определенное количество символов из одного буфера в другой,
даже когда буфера находятся в разных сегментах
Прототипы перечисленных функций содержатся в файле memory.h (MSC) и в файлах
mem.h и string.h (ТС).
Система программирования ТС предоставляет дополнительно следующие функции для
работы с буферами:
Функция
Краткое описание
memove
копирует указанное количество символов из одного буфера в другой
movmem
копирует указанное количество символов из одного буфера в другой
setmem
инициализирует заданным значением указанное количество байтов в буфере
Прототипы функций memmove и movmem содержатся в файлах mem.h и string.h.
Прототип функции setmem содержится в файле mem.h.
Для работы со строками существуют следующие библиотечные функции (ТС & MSC):
Функция
Краткое описание
strcat
катенация (склеивание) строк
strchr
найти первое вхождение заданного символа в строке
strcmp
сравнить две строки
strcpy
копировать одну строку в другую
strcspn
найти первое вхождение символа из заданного набора символов в строке
strdup
дублирование строки
strerror сформировать в строке сообщение об ошибке, состоящее из двух частей:
системной диагностики и необязательного добавочного пользовательского
сообщения
stricmp
сравнить две строки, считая символы нижнего и верхнего регистров
эквивалентными
strlen
вычислить длину строки

strlwr
strncat
strncmp
strncpy
strnicmp
strnset
strpbrk
strrchr
strrev
strset
strspn
strstr
strtok
strupr

преобразовать строку в нижний регистр (строчные буквы)
добавить n символов в строку
сравнение n символов в двух строках
скопировать n символов из одной строки в другую
сравнение n символов двух строк
установить n символов в строке в заданное значение
найти первое вхождение любого символа из заданного набора в строке
найти последнее вхождение заданного символа в строке
инвертировать (перевернуть) строку
установить все символы строки в заданное значение
найти первую подстроку из заданного набора символов в строке
найти первую подстановку одной строки (более короткой) в другой
найти следующую точку в строке
преобразовать строку в верхний регистр (заглавные буквы)

Кроме того, система программирования MSC предоставляет дополнительно функцию
strcmpi (идентична функции stricmp), а система программирования ТС предоставляет
функцию stpcpy (идентична функции strcpy, но возвращает в точку вызова другое
значение).
Прототипы всех функций работы со строками содержатся в файле string.h. Все
функции работают со строками, завершающимися нулевым байтом ('\0'). Для работы с
массивом символов, не имеющим в конце нулевого байта, вы можете использовать функции
преобразования буферов, описанные выше.

9.2

Определение класса символов и преобразование символов

Функция
isalnum
isalpha
isascii
iscntrl
isdigit
isgraph
islower
isprint
ispunct
isspace
isupper
isxdigit
toascii
tolower
toupper
_tolower
_toupper

Краткое описание
проверка на букву или цифру
проверка на букву
проверка на символ из набора кодировки ASCII
проверка на управляющий символ
проверка на десятичную цифру
проверка на печатный символ, исключая пробел
проверка на малую букву
проверка на печатный символ
проверка на знак пунктуации
проверка на пробельный символ
проверка на заглавную букву
проверка на шестнадцатеричную цифру
преобразование символа в код ASCII
проверка и преобразование в малую букву, если заглавная буква
проверка и преобразование малой буквы в заглавную
преобразование буквы в малую (без проверки)
преобразование буквы в заглавную (без проверки)

Все эти функции реализованы как макроопределения, заданные в файле ctype.h

9.3

Форматные преобразования данных

Функция
atof
atoi
atol
ecvt
fcvt
gcvt
itoa
ltoa
ultoa

преобразование
преобразование
преобразование
преобразование
преобразование
преобразование
преобразование
преобразование
преобразование

Краткое описание
строки, в представляемое ей число типа float
строки в число типа int (целое)
строки в число типа long (длинное целое)
числа типа double в строку
числа типа double в строку
числа типа double в строку
числа типа int в строку
числа типа long в строку
числа типа unsigned long в строку

Система
Функция
strtod
strtol
strtoul

программирования ТС предоставляет также следующие функции:
Краткое описание
преобразование строки в число типа double (покрывает возможности atof)
преобразование строки в число типа long (покрывает возможности atol)
преобразование строки в число типа unsigned long

Прототипы всех перечисленных функций содержатся
функции atof содержится, кроме того, в файле math.h.

9.4

в

файле

stdlib.h.

Прототип

Работа с каталогами файловой системы

Функция
chdir
getcwd
mkdir
rmdir
Система
функции:
Функция
findfirst
findnext
fnmerge
fnsplit
getcurdir
getdisk
searchpath
setdisk

Краткое описание
изменение текущего рабочего каталога
получить имя текущего рабочего каталога
создать новый каталог
удаление каталога
программирования

ТС

предоставляет,

кроме

перечисленных,

следующие

Краткое описание
начало поиска файла по шаблону имени
продолжение поиска файла по шаблону имени
создание имени файла из отдельных компонент
разбиение имени файла на отдельные компоненты
узнать текущий каталог
узнать текущее устройство
поиск файла в различных каталогах
задать текущее устройство

В системе программирования MSC прототипы функций содержатся в файле direct.h, в
системе программирования ТС прототипы функций содержатся в файле dir.h.

9.5

Операции над файлами

Функция
access
chmod
filelength
isatty
mktemp
remove
rename
setmode

Краткое описание
определение прав доступа к файлу
изменение прав доступа к файлу
измерение длины файла
проверка, является ли устройство символьным
генерация уникального имени файла
уничтожение файла
переименование файла
установить новые значения для параметров файла

Система
Функция
chsize
fstat
locking

программирования MSC предоставляет дополнительно следующие функции:
Краткое описание
изменение размера файла
получение информации о файле
запирает область в файле (работает с версией ОС MS-DOS 3.0 и выше),
временно запрещая к ней доступ со стороны других процессов, или отпирает
эту область
получение информации о файле
установка маски для выбора режима работы по умолчанию
удаление файла

slat
umask
unlink

Система программирования ТС предоставляет дополнительно функции:
Функция
Краткое описание
chmod
изменение прав доступа к файлу
lock
запирает область файла для доступа со стороны других процессов (работает
с версией MS-DOS 3.0 и выше)
unlock
отпирает область (работает с версией MS-DOS 3.0 и выше)
Прототипы функций, за исключением функций fstat и stat, содержатся в файле io.h;
прототипы функций fstat и stat описаны в файле sys\stat.h.
Функции access, chmod, rename, stat и unlink оперируют с файлами, которые
задаются через имя пути (pathname) -или через имя файла.
Функции chsize, filelength, isatty, locking, setmode, fstat работают с уже
открытыми файлами, которые определяются дескрипторами (handle) (смотри далее описание
функций ввода/вывода нижнего уровня).

9.6

Ввод и вывод

Функции ввода и вывода в стандартной библиотеке Си позволяют читать данные из
файлов или получать их с устройств ввода (например, с клавиатуры) и записывать данные
в файлы, или выводить их на различные устройства (например, на принтер).
Функции ввода/вывода делятся на три класса:
1) Ввод/вывод верхнего уровня (с использованием понятия "поток").
2) Ввод/вывод для консольного терминала путем непосредственного обращения к нему.
3) Ввод/вывод нижнего уровня (с использованием понятия "дескриптор").
В библиотеке есть также функции для работы с последовательным портом (СОМ), они
отнесены условно ко второй группе.
функции ввода/вывода верхнего уровня обеспечивают буферизацию работы с файлами.
Это означает, что, когда производится чтение информации из файла или запись
информации в файл, обмен информацией осуществляется не между программой и указанным
файлом, а между программой и промежуточным буфером, расположенным в оперативной
памяти.
Если производится операция записи в файл, то информация из буфера записывается в
файл при заполнении буфера или при закрытии файла (или при выполнении каких-то других
условий, смотри ниже). Если информация считывается из файла, то она на самом деле
берется из буфера, а в буфер информация считывается из файла при открытии файла и
впоследствии каждый раз при исчерпании (опустошении) буфера. Буферизация ввода/вывода
выполняется автоматически, она позволяет ускорить выполнение программы за счет
уменьшения
количества
обращений
к
сравнительно
медленно
работающим
внешним
устройствам.
Для пользователя файл, открытый на верхнем уровне, представляется как
последовательность
считываемых
или
записываемых
байтов.
Чтобы
отразить
эту
особенность организации ввода/вывода, предложено понятие "поток" (соответствует
английскому слову stream). Когда файл открывается, с ним связывается поток, выводимая
информация записывается "в поток", считываемая информация берется "из потока".
Когда поток открывается для ввода/вывода, он связывается со структурой типа FILE
(имя типа FILE определяется с помощью конструкции typedef в файле stdio.h). Структура
содержит разнообразную информацию о файле. При открытии файла с помощью функции fopen
возвращается указатель на структуру типа FILE. Этот указатель (указатель потока)
используется для последующих операций с файлом, пользователь не обязан вникать в
способ организации потока, он только должен сохранить полученный указатель и
передавать его значение всем библиотечным функциям, используемым для ввода/вывода
через этот поток.
Функции
в/в
верхнего
уровня
дают
возможность
для
буферизованного
форматированного и неформатированного ввода/вывода.
Функции в/в верхнего уровня относятся к числу функций, одинаково реализуемых в
различных ОС и на разных компьютерах, с их помощью пользователь имеет возможность
писать переносимые программы.
Функции ввода/вывода для консоли и порта распространяют возможности функций
ввода/вывода верхнего уровня на этот класс устройств, добавляя новые возможности.
Они позволяют читать или записывать на консоль (терминал) или в порт
ввода/вывода (например, порт принтера). Функции в/в с портом читают или записывают
данные побайтно. Некоторые дополнительные режимы устанавливаются для в/в с консоли
(например: ввод с эхо-печатью символов и без эхо-печати).
Функции в/в для консоли и порта являются уникальными для компьютеров типа
IBM/PC.
Функции в/в низкого уровня не выполняют буферизацию и форматирование данных; они
позволяют непосредственно пользоваться средствами ввода/вывода операционной системы.
При низкоуровневом открытии файла (при помощи функции open) с ним связывается
дескриптор (handle). Дескриптор является целым значением, характеризующим размещение
информации об открытом файле во внутренних таблицах системы. Дескриптор используется
при последующих операциях с файлом.
Функции в/в нижнего уровня из стандартной библиотеки целесообразно использовать
при разработке своей собственной подсистемы ввода/вывода.
Функции в/в нижнего уровня переносимы в рамках некоторых систем программирования
Си, в частности относящихся к ОС UNIX.
9.6.1 Функции вода/вывода высокого уровня
Функция
clearerr
fclose
fcloseall

Краткое описание
очистка флажка ошибки для потока
закрытие потока
закрытие всех открытых (на верхнем уровне) файлов

fdopen
feof
ferror
flush
fgetc
fileno
fgetchar
fgets
flushall
fopen
fprint
fputc
fputchar
fputs
fread
freopen
fscanf
fseek
ftell
fwrite
getc
getchar
gets
getw
printf
putc
putchar
puts
putw
rewind
scanf
setbuf
setvbuf
sprintf
sscanf
tempnam
tmpfile
ungetc
vfprintf
vsprintf

создание потока для файла, ранее открытого на нижнем уровне, используя
дескриптор
проверка на конец потока
проверка флажка ошибок потока
сброс буфера потока на связанное с ним внешнее устройство
чтение символа из потока
получение дескриптора файла, связанного с потоком
чтение символа из стандартного потока ввода stdin
чтение строки из потока
сброс буферов всех потоков
открытие потока (открыть файл и связать его с потоком)
запись данных в поток по формату
запись символа в поток
запись символа в стандартный поток вывода stdout
запись строки в поток
неформатированное чтение данных из потока
повторное открытие потока в новом режиме
чтение из потока по формату
перемещение указателя файла в заданную позицию
получение текущей позиции указателя файла
неформатированная запись данных в поток
чтение символа из потока (реализуется через макроопределение)
чтение символа из потока stdin (версия макро)
чтение строки из потока stdin
чтение двух байтов (по размеру int) в формате слова из потока
запись данных в поток stdout по формату
запись символа в поток (версия макро)
запись символа в поток stdout (версия макро)
запись строки в поток
запись двух байтов (по размеру int) в формате слова в поток
установка указателя по файлу на начало файла
чтение данных из потока stdin по формату
управление буферизацией потока
управление буферизацией потока и размером буфера
запись данных в строку по формату
чтение данных из строки по формату
сгенерировать имя временного файла в заданном каталоге
создать временный файл
вернуть символ в поток
запись данных в поток по формату
запись данных в строку по формату

Система
Функция
rmtemp
tmpnam
vprintf

программирования MSC дополнительно предоставляет следующие функции:
Краткое описание
удаление временных файлов, созданных посредством функции tmpfile
сгенерировать имя временного файла
запись данных в поток stdout по формату

Система
Функция
vfscanf
vscanf
vsscanf

программирования ТС дополнительно предоставляет следующие функции:
Краткое описание
эти функции подобны функциям fscanf, scanf и sscanf, но принимают как
параметр указатель на список аргументов — адресов переменных, которым
присваиваются вводимые значения

Прототипы всех функций ввода/вывода верхнего уровня содержатся в файле stdio.h.
Некоторые константы, определенные в stdio.h, могут быть полезны в программе:
константа EOF
код, возвращаемый как признак конца файла
константа NULL
значение указателя, который не содержит адрес никакого реально
размещенного в оперативной памяти объекта
константа BUFSIZ
определяет размер буфера потока в байтах
имя типа FILE
структура, которая содержит информацию о потоке

9.6.1.1 Высокоуровневое открытие файлов
Функции открытия потока возвращают указатель на тип FILE (этот указатель
называют также указателем потока), этот указатель используется при дальнейших
обращениях к потоку.
9.6.1.2 Стандартные потоки: stdin, stdout, stdeir, stdaux, stdprn.
Когда программа начинает выполняться, автоматически открываются пять потоков.
Эти потоки — стандартный ввод (stdin), стандартный вывод (stdout), стандартный вывод
для сообщений об ошибках (stderr), стандартный последовательный порт (stdaux) и
стандартное устройство печати (stdprn).
По умолчанию стандартный ввод/вывод и стандартный вывод сообщений об ошибках
связывается с консольным терминалом.
Назначения по умолчанию для стандартного порта и стандартного устройства печати
зависят от конфигурации аппаратуры компьютера; эти потоки обычно связываются с
последовательным портом и принтером, но могут быть и не установлены в отдельных
системах.
Следующие указатели на структуру типа. FILE определяются в файле stdio.h и могут
использоваться в любом месте как указатели потоков:
extern FILE * stdin; — стандартный ввод
extern FILE * stdout; — стандартный вывод
extern FILE * stderr; — стандартный вывод сообщений об ошибках
extern FILE * sidaux; — стандартный порт
extern FILE * stdprn; — стандартное устройство печати
При запуске оттранслированной программы на выполнение можно использовать символы
перенаправления в/в из командного языка MS-DOS ( < , > или >> ) для переопределения
стандартного ввода и вывода программы.
Можно переопределить stdin, stdout, stderr, stdaux или stdprn так, что они будут
относиться к файлу на диске или устройству. Такие возможности предоставляет функция
freopen.
9.6.1.3 Управление буферизацией потоков
Открытые
файлы,
для
которых
осуществляется
высокоуровневый
ввод/вывод,
буферизуются по умолчанию, за исключением потоков stdin, stdout, stderr, stdaux,
stdprn.
Потоки stderr и stdaux — не буферизованы. Если к ним применяется функция printf
или scanf, создается временный буфер. Для обоих потоков может задаваться буферизация
с помощью функций setbuf или setvbuf.
Буферизация для потоков stdin, stdout, stdprn выполняется следующим образом:
буфер сбрасывается при его заполнении или когда вызванная библиотечная функция
ввода/вывода завершает работу.
Использованием функции setbuf или setvbuf можно сделать поток небуферизованным
или связать буфер с небуферизованным до этого потоком. Буфера, размещенные в системе,
недоступны пользователю, кроме буферов, полученных с помощью setbuf или setvbuf.
Буфера должны иметь постоянный размер, равный константе BUFSIZ в stdio.h.
Если используется setvbuf, размер буфера устанавливает пользователь. Буфера
автоматически сбрасываются при их наполнении, или когда связанный с буфером файл
закрывается, или когда происходит нормальное завершение программы.
Можно сбросить буфера в произвольный момент времени, используя функции fflush и
flushall. Функция fflush сбрасывает буфер одного заданного потока, а функция flushall
сбрасывает буфера всех потоков, которые открыты и буферизованы в данный момент.
9.6.1.4 Закрытие потоков
Функции fclose и fcloseall закрывают поток или потоки. Функция fclose закрывает
один заданный поток, fcloseall — все потоки, кроме потоков stdin, stdout, stderr,
stdaux, stdprn.
Если программа не выполняет закрытия потоков, потоки автоматически закрываются,
когда программа завершается неаварийно. Однако следует закрывать потоки по завершении
работы с ними, так как число потоков, которые могут быть открыты одновременно,
ограничено.
9.6.1.5 Чтение и запись данных
Функции ввода/вывода верхнего
способами.

уровня

позволяют

передавать

данные

различными

Операции чтения и записи в потоках начинаются с текущей. позиции в потоке,
идентифицируемой как "file pointer"
(указатель файла) для потока. Указатель файла изменяется после выполнения
операции чтения или записи.
Например, если Вы читаете один символ из потока, указатель файла продвигается на
1 байт, так что следующая операция начнется с первого несчитанного символа. Если
поток открыт для добавления, указатель файла автоматически позиционируется на конец
файла перед каждой операцией записи.
Поток, связанный с таким устройством, как консольный терминал, не имеет
указателя файла. Программы, которые перемещают указатель файла (с помощью функции
fseek), будут иметь в этом случае неопределенный результат.
9.6.1.6 Обнаружение ошибок
Когда происходит ошибка в операции с потоком, устанавливается в ненулевое
значение флажок ошибки для потока. Можно использовать макроопределение ferror, чтобы
определить, произошла ли ошибка.
После каждой ошибки флажок ошибки остается установленным до тех пор, пока не
будет сброшен вызовом функции clearerr или rewind.
9.6.2 Функции вода/вывода нижнего уровня
Функция
close
creat
dup
dup2
eof
lseek
open
read
sopen
tell
write

Краткое описание
закрыть файл
создать файл
создать второй дескриптор (handle) для файла
переназначить дескриптор (handle) для файла
проверка на конец файла
позиционирование указателя файла в заданное место
открыть файл
читать данные из файла
открыть файл в режиме разделения
получить текущую позицию указателя файла
записать данные в файл

Система
Функция
_creat
creatnew
creattemp
_ореn
_read
_write

программирования ТС предоставляет дополнительно следующие функции:
Краткое описание
создать файл
создать новый файл
создать новый файл
открыть файл
чтение данных из файла
запись данных в файл

Нижний уровень ввода и вывода не работает с буферизованными или форматированными
данными. Для работы с файлами, открытыми посредством функции нижнего уровня,
используется дескриптор файла (handle).
Для открытия файлов используются функции open и _ореn; В ОС MS/DOC версии 3.0
или выше может быть использована функция sopen для открытия файлов с атрибутами
режима разделения файла.
функции нижнего уровня, в отличие от функций верхнего уровня, не требуют
включения файла stdio.h. Тем не менее нескольких общих констант, определенных в файле
stdio.h, как, например, признак конца файла EOF, могут оказаться полезными. Если
программа использует эти константы, необходимо включить файл stdio.h.
Прототипы функций нижнего уровня содержатся в файле io.h.
9.6.2.1 Открытие файлов
Файл должен быть открыт функциями open, sopen или creat до выполнения первой
операции ввода или вывода с использованием функций нижнего уровня для этого файла.
Файл может быть открыт для чтения, записи, или для чтения и записи, может быть
открыт в текстовом или в двоичном режиме.
Файл fcntl.h должен быть включен при открытии файла, так как содержит
определения для флагов, используемых в функции open. В некоторых случаях также должны
быть включены файлы sys\types.h и sys\stat.h.
Перечисленные функции возвращают дескриптор файла, который используется при
последующих операциях с файлом. При вызове одной из функций открытия файла необходимо

возвращаемое
функцией
значение
присвоить
целочисленной
переменной
использовать значение этой переменной, чтобы обращаться к открытому файлу.

и

потом

9.6.2.2 9.6.2.2. Переопределение дескрипторов (handle)
Когда
программа
начинает
выполняться,
пять
дескрипторов
(handle),
соответствующих стандартным вводу, выводу, выводу сообщений об ошибках, порту и
устройству печати, уже назначены. Пользователь может использовать значения этих
дескрипторов при вызове функций ввода/вывода нижнего уровня.
Каждый из этих дескрипторов соответствует одному из стандартных потоков,
значения этих дескрипторов таковы:
поток
значение дескриптора
stdin
0
stdout
1
stderr
2
stdaux
3
stdprn
4
Можно использовать эти дескрипторы файлов в программе без предварительного
открытия этих файлов. Они автоматически открываются при запуске программы.
Так же, как с функциями для потоков, Вы можете использовать перенаправление,
чтобы переопределить стандартный ввод и вывод.
Функции dup и dup2 позволяют назначать несколько handle для одного файла; эти
функции обычно используются, чтобы связать дополнительные дескрипторы с уже
используемыми файлами.
9.6.2.3 Чтение и запись данных
Функции read и write, как и функции ввода/вывода верхнего уровня, начинают
выполнение очередной операции с текущей позиции в файле. Текущая позиция изменяется
при каждой операции чтения или записи.
Функция eof может быть использована для проверки на конец файла.
Когда происходит ошибка, программы в/в нижнего уровня присваивают код ошибки
переменной errno. Можно использовать функцию perror для печати информации об ошибках
в/в. Можно позиционировать указатель файла на определенную позицию в файле, используя
функцию lseek. Используя функцию tell, можно определить текущую позицию указателя
файла. Устройства типа консольного терминала не имеют указателя файла. Результат
функций lseek и tell не определен, если они применяются к дескриптору, связанному с
таким устройством.
9.6.2.4 Закрытие файлов
Функция close закрывает открытые файлы. Открытые
закрываются при неаварийном завершении программы.

файлы

также

автоматически

9.6.3 Функции вода/вывода с консольного терминала и порта
Функции ввода/вывода для консольного терминала выделены в отдельную группу,
потому что они используют специфические особенности компьютера IBM/PC (наличие
специального видеоадаптера) и не являются переносимыми на другие типы компьютеров.
функция
cgets
cprintf
cputs
getch
getche
kbhit
putch
ungetch

Краткое описание
чтение строки с консоли
запись данных на консольный терминал по формату
вывод строки на консольный терминал
чтение символа с консоли
чтение символа с консоли с эхо-печатью
проверка нажатия клавиши на консоли
вывод символа на консольный терминал
возврат последнего прочитанного символа с консольного символа обратно с
тем, чтобы он стал следующим символом для чтения
Система программирования MSC предоставляет дополнительно функцию cscanf - чтение
данных с консоли по формату.
Система программирования ТС предоставляет дополнительно функцию getpass - ввод с
терминала пароля без эхо-печати
Прототипы функций содержатся в файле conio.h. Устройства: консольный терминал и
порт не могут быть открыты или закрыты перед выполнением в/в, поэтому функции fopen и
fclose не вызываются. Функции в/в с консольного терминала позволяют читать и
записывать строки (cgets и cputs), форматированные данные (cscanf и cprintf) и

символы. Функция kbhit определяет: было ли нажатие клавиши на консольном терминале.
Эта функция позволяет определить наличие символов для ввода с клавиатуры до попытки
чтения.

9.7

Математические функции

Функция
abs
acos
asin
atan
atan2
cabs
ceil
_clear87
_control87
cos
cosh
exp
fabs
floor
fmod
_fpreset
frexp
hypot
labs
ldexp
log
log10
matherr
modf
pow
sin
sinh
sqrt
_status87
tan
tanh

Краткое описание
нахождение абсолютного значения выражения типа int
вычисление арккосинуса
вычисление арксинуса
вычисление арктангенса х
вычисление арктангенса от у/х
нахождение абсолютного значения комплексного числа
нахождение наименьшего целого, большего или равного х
получение значения и инициализация слова состояния сопроцессора и
библиотеки арифметики с плавающей точкой
получение старого значения слова состояния для функций арифметики с
плавающей точкой и установка нового состояния
вычисление косинуса
вычисление гиперболического косинуса
вычисление экспоненты
нахождение абсолютного значения типа double
нахождение наибольшего целого, меньшего или равного х
нахождение остатка от деления х/у
повторная инициализация пакета плавающей арифметики
разложение х как произведения мантиссы на экспоненту 2n
вычисление гипотенузы
нахождение абсолютного значения типа long
вычисление х*2exp
вычисление натурального логарифма
вычисление логарифма по основанию 10
управление реакцией на ошибки при выполнении функций математической
библиотеки
разложение х на дробную и целую часть
вычисление х в степени у
вычисление синуса
вычисление гиперболического синуса
нахождение квадратного корня
получение значения слова состояния с плавающей точкой
вычисление тангенса
вычисление гиперболического тангенса

Система программирования MSC предоставляет дополнительно функции:
Функция
Краткое описание
bessel
вычисление функции Бесселя
dieeetomsbin преобразование плавающего числа двойной точности из IEEE-формата в
Microsoft-формат
dmsbintoieee преобразование плавающего числа двойной точности из Microsoft-формата
в IEEE-формат
fieeetomsbin преобразование числа с плавающей точкой из IEEE-формата в Microsoftформат
fmsbintoieee преобразование числа с плавающей точкой из Microsoft-формата в IEEEформат
Система программирования ТС предоставляет дополнительно функции:
Функция
Краткое описание
_matherr
управление реакцией на ошибки при выполнении функций из математической
библиотеки
pow10
вычисление десятичной степени
Прототипы функций содержатся в файле math.h, за исключением прототипов функций
_clear87, _control87, _fpreset, status87, которые определены в файле float.h. Функция
matherr (ее пользователь может задать сам в своей программе) вызывается любой
библиотечной математической функцией при возникновении ошибки. Эта программа
определена в библиотеке, но может быть переопределена пользователем, если она
необходима, для установки различных процедур обработки ошибок.

9.8

Динамическое распределение памяти

Библиотека языка Си предоставляет механизм распределения динамической памяти
(heap). Этот механизм позволяет динамически (по мере возникновения необходимости)
запрашивать из программы дополнительные области оперативной памяти.
Работа функций динамического распределения памяти различается для различных
моделей памяти, поддерживаемых системой программирования (смотри первую части книги).
В малых моделях памяти (tiny, small, medium) доступно для использования все
пространство между концом сегмента статических данных программы и вершиной
программного стека, за исключением 256-байтной буферной зоны непосредственно около
вершины стека.
В больших моделях памяти (compact, large, huge) все пространство между стеком
программы и верхней границей физической памяти доступно для динамического размещения
памяти.
Следующие функции используются для динамического распределения памяти:
Функция
Краткое описание
calloc
выделить память для массива
free
освободить блок, полученный посредством функции calloc, malloc или
realloc
malloc
выделить блок памяти
realloc
переразместить ранее выделенный блок памяти, изменив его размер
sbrk
переустановить адрес первого байта оперативной памяти, недоступного
программе (начала области памяти вне досягаемости программы)
Система программирования MSC предоставляет дополнительно функции:
Функция
Краткое описание
alloca
выделение блока памяти из программного стека
_expand
изменение размера блока памяти, не меняя местоположения блока
_ffree
освобождение блока, выделенного посредством функции fmalloc
_fmalloc
выделение блока памяти вне данного сегмента
_freect
определить примерное число областей заданного размера, которые можно
выделить
_fmsize
возвращает размер блока памяти, на который указывает дальний (far)
указатель
halloc
выделить память для большого массива (объемом более 64 Кбайтов)
hfree
освободить блок памяти, выделенный посредством функции halloc
_memavl
определить примерный размер в байтах памяти, доступной для выделения
_msize
определить размер блока, выделенного посредством функций calloc,
malloc, realloc
_nfree
освобождает блок, выделенный посредством _nmalloc
_nmalloc
выделить блок памяти в заданном сегменте
_nmsize
определить размер блока, на которой указывает близкий (near) указатель
stackavail
определить объем памяти, доступной для выделения посредством функции
alloca
Система программирования ТС предоставляет дополнительно функции:
Функция
Краткое описание
brk
переустановить адрес первого байта оперативной памяти, недоступного
программе (начала области памяти вне досягаемости программы)
allocmem
низкоуровневая функция выделения памяти
freemem
низкоуровневая функция возврата памяти операционной системе
coreleft
узнать, сколько осталось памяти для выделения в данном сегменте
farcalloc
выделить блок памяти вне данного сегмента
farcoreleft определить, сколько памяти для размещения осталось вне данного сегмента
farmalloc
выделить блок памяти вне данного сегмента
farrealloc
изменить размер блока, ранее выделенного функцией farmalloc или
farcalloc
farfree
освободить блок, ранее выделенный функцией farmalloc или farcalloc
Прототипы функций содержатся в файле malloc.h для системы программирования MSC и
в файле alloc.h для системы программирования ТС.
Функции calloc и malloc выделяют блоки памяти, функция malloc выделяет заданное
число байтов, тогда как calloc выделяет и инициализирует нулями массив элементов
заданного размера.
Функции _fmalloc и _nmalloc подобны malloc, за исключением того, что _fmalloc и
_nmalloc позволяют выделить блок байтов в том случае, когда существуют ограничения

адресного пространства текущей модели памяти. Функция halloc выполняется аналогично
calloc, но halloc выделяет память для большого массива (больше 64 К).
Функции realloc и _expand изменяют размер полученного блока.
Функция free (для calloc, malloc и realloc), функция ffree (для _fmalloc),
функция _nfree (для _nmalloc) и функция hfree (для halloc) освобождают память,
которая была выделена ранее, и делают ее доступной для последующего распределения.
Функции _freect и _memavl определяют: сколько памяти доступно для динамического
выделения в заданном сегменте; _freect возвращает примерное число областей заданного
размера, которые могут быть выделены; _memavl возвращает общее число байтов,
доступных для выделения.
Функции _msize (для calloc, malloc, realloc и _expand), _fmsize (для _fmalloc) и
_nmsize (для _nmalloc) возвращают размер ранее выделенного блока памяти.
Функция sbrk — это функция нижнего уровня для получения памяти. Вообще говоря,
программа, которая использует функцию sbrk, не должна использовать другие функции
выделения памяти, хотя их использование не запрещено.
Все выше описанные функции распределяли области памяти из общей памяти. Система
программирования MSC предоставляет 2 функции, alloca и stackavail, для выделения
памяти из стека и определения количества доступной памяти в стеке.

9.9

Использование системных вызовов операционной системы MS-DOS

Функция
bdos
dosexterr
FP_OFF
FP_SEG
int86
int86x
intdos
intdosx
segread

Краткое описание
вызов системы MS-DOS; используются только регистры DX и AL
получение значений регистров из системы MS-DOS вызовом 59H
возвращает смещение far-указателя
возвращает сегмент far-указателя
вызов прерывания MS-DOS
вызов прерывания MS-DOS
системный вызов MS-DOS
системный вызов MS-DOS
возвращает текущее значение сегментных регистров

Прототипы функций и макроопределения содержатся в файле dos.h.
Система программирования MSC предоставляет дополнительно функции:
Функция
Краткое описание
inp
чтение с указанного порта в/в
outp
вывод в указанный порт в/в
Прототипы функций inp и outp содержатся в файле conio.h.
Система программирования ТС предоставляет дополнительно следующие функции:
Функция
Краткое описание
absread
чтение с диска по номеру сектора
abswrite
запись на диск по номеру сектора
bdosptr
вызов системы MS-DOS
country
определение способа записи времени в данной стране
ctrlbrk
установить реакцию на
disable
отменить прерывания
enable
разрешить прерывания
freemem
освободить память
getinterrupt возбудить прерывание
getcbrk
узнать установленную реакцию на
getdfree
узнать объем свободного места на диске
getdta
узнать адрес области передачи данных диска
getfat
получить информацию из таблицы размещения файлов
getfatd
получить информацию из таблицы размещения файлов
getpsp
получить сегментный префикс для текущего программного адреса текущего
выполняемого процесса
getvect
узнать значение вектора прерывания
getverify
узнать режим проверки записи на диск
harderr
регистрация функции обработки аппаратных ошибок
hardresume
возврат из функции обработки аппаратных ошибок
hardretn
возврат из функции обработки аппаратных ошибок
inport
ввести слово из порта
inportb
ввести байт из порта
intr
аналог функции int86
keep
зафиксировать программу в памяти

MK_FP
outport
outportb
parsfnm
peek
peekb
poke
pokeb
randbrd
randbwr
setdta
setvect
setverify
sleep
unlink

составить far-указатель из компонент
вывести слово в порт
вывести байт в порт
выделение имени файла из командной строки MS-DOS
получить значение слова по адресу
получить значение байта по адресу
записать слово в память по адресу
записать байт в память по адресу
чтение с диска
запись на диск
установить адрес области передачи данных диска
задать значение вектора прерывания
включить режим проверки записи на диск
задержка
удаление файла

Прототипы функций и макроопределения содержатся в файле dos.h.
Система программирования ТС предоставляет также следующие функции для обращения
к BIOS (базовой подсистеме ввода/вывода операционной системы):
Функция
Краткое описание
bioscom
управление последовательным каналом
biosdisk
управление диском
biosequip
узнать конфигурацию аппаратуры
bioskey
управление клавиатурой
biosmemory
узнать объем оперативной памяти
biosprint
управление устройством печати
biostime
управление BIOS-таймером
Прототипы функций обращения к BIOS содержатся в файле bios.h.

9.10 Управление процессами
Функция
abort
execl
execle
execlp
execlpe
execv
execve
execvp
execvpe
exit
_exit
signal
spawnl
spawnle
spawnlp
spawnlpe
spawnv
spawnve
spawnvp
spawnvpe
system

Краткое описание
завершить процесс
выполнить порождаемый процесс со списком аргументов
выполнить порождаемый процесс со списком аргументов и заданным
окружением (контекстом имен командного языка операционной системы)
выполнить порождаемый процесс, используя переменную PATH и список
аргументов
выполнить порождаемый процесс, используя переменную PATH, заданное
окружение и список аргументов
выполнить порождаемый процесс с массивом аргументов
выполнить порождаемый процесс с массивом аргументов и заданным
окружением
выполнить порождаемый процесс, используя переменную PATH и массив
аргументов
выполнить порождаемый процесс, используя переменную PATH, заданное
окружение и массив аргументов
завершить процесс
завершить процесс без скидывания буферов
управление сигналом прерывания
выполнить порождаемый процесс со списком аргументов
выполнить порождаемый процесс со списком аргументов и заданным
окружением
выполнить порождаемый процесс, используя переменную PATH и список
аргументов
выполнить порождаемый процесс, используя переменную PATH, заданное
окружение и список аргументов
выполнить порождаемый процесс с массивом аргументов
выполнить порождаемый процесс с массивом аргументов и задан ным
окружением
выполнить порождаемый процесс, используя переменную PATH и массив
аргументов
выполнить порождаемый процесс, используя переменную PATH, заданное
окружение и массив аргументов
выполнение команды MS-DOS

Система программирования MSC предоставляет дополнительно функции:
Функция
Краткое описание
getpid
получить номер процесса
onexit
выполнить функцию при завершении программы
Термин "процесс" относится к программе, которая выполняется под управлением
операционной системы. Процесс состоит из кодов программы и данных, а также информации
о состоянии процесса, такой, как число открытых файлов. Где бы ни выполнялась
программа на уровне MS-DOS, запускается процесс. Можно запустить, остановить и
управлять процессом из программы, используя функции управления процессом. Прототипы
всех функций управления процессами объявлены в файле process.h (исключая функцию
signal). Прототип функции signal содержится в файле signal.h. Функции управления
процессом позволяют следующее:
1) Узнать уникальный номер процесса (getpid).
2) Завершить процесс (abort, exit, _exit).
3) Управлять сигналами прерывания (signal).
4) Начать новый процесс (разновидности ехес и spawn функции, system функция).
Функции abort и _exit осуществляют немедленное завершение без скидывания буферов
потоков, функция exit осуществляет выход после скидывания буферов потоков. Функция
system вызывает на выполнение заданную команду MS-DOS. Функции ехес и spawn создают
новый процесс, называемый порождаемым процессом. Разница между функциями ехес и spawn
в том, что spawn способна возвращать управление из порождаемого процесса к его
родителю. Оба, и родитель, и порождаемый процесс, размещаются в памяти (если не
указан флаг P_OVERLAY).
В функции ехес порождаемый процесс перекрывает порождающий процесс, так что
возврат управления в родительский процесс невозможен (если не произошла ошибка во
время попытки запуска на выполнение порождаемого процесса).
В таблице описывается способ формирования ехес и spawn. Имя функции задается в
первом поле. Второе поле определяет: используется ли переменная PATH для поиска файла
для выполнения, который определяет порождаемый процесс.
Третье поле описывает метод передачи аргументов порождаемому процессу. Передача
аргументов списком означает, что аргументы в порождаемый процесс передаются один за
одним, в том порядке, как пользователь перечислил их в обращении к функции ехес или
spawn. Передача аргументов массивом означает, что аргументы помещаются в массив и
указатель на массив передается порождаемому процессу. Передача списком обычно
используется, когда число аргументов постоянно и известно заранее, а метод передачи
аргументов массивом полезен, когда число аргументов должно быть определено во время
работы. Последнее поле определяет: унаследует ли порождаемый процесс от родителя
окружение, или оно будет изменено для него.
Таблица 9.1.
функция
Использование PATH
Способ передачи аргументов
Окружение
переменной
execl
не использует PATH
список аргументов
наследует от родителя
spawnl
execle
не использует PATH
список аргументов
указатель на таблицу окружения
spawnle
(последний аргумент)
execlp
использует PATH
список аргументов
наследует от родителя
spawnlp
execlpe использует PATH
список аргументов
указатель на таблицу окружения
(последний аргумент)
spawnlpe
execv
не использует PATH
массив аргументов
наследует от родителей
spawnv
execve
не использует PATH
массив аргументов
указатель на таблицу окружения
(последний аргумент)
spawnve
execvp
использует PATH
массив аргументов
наследует от родителя
spawnvp
execvpe использует PATH
массив аргументов
указатель на таблицу окружения
spawnvpe
(последний аргумент)

9.11 Поиск и сортировка
Следующие библиотечные функции предназначены для поиска и сортировки в массиве:
Функция
Краткое описание

bsearch
lfind
lsearch
qsort

выполняет двоичный поиск
выполняет линейный поиск для заданного значения
выполняет линейный поиск для заданного значения, которое добавляется в
массив, если не найдено
выполняет быструю сортировку

Прототипы функций содержатся в файле search.h в системе программирования MSC, в
файле stdlib.h в системе программирования ТС.

9.12 Функции работы со временем
Функция
asctime
ctime
gmtime
localtime
tzset

Краткое описание
преобразование времени из структуры (внутренней формы) в символьную
строку
преобразование времени из длинного целого (long int) в строку символов
преобразование времени из целого (int) в структуру
преобразование времени из целочисленного (int) в структуру с локальной
поправкой
установить переменную времени из переменной времени среды

Система программирования MSC предоставляет дополнительные функции:
Функция
Краткое описание
ftime
получить текущее время системы как структуру
time
получить текущее системное время как длинное целое (long int)
utime
установить время изменения файла
Система программирования ТС предоставляет дополнительные функции:
Функция
Краткое описание
difftime
вычислить разность по времени
dostounix
преобразование времени из формате ОС MS-DOS в формат ОС UNIX
getdate
получить системную дату как структуру
getftime
получить системную дату
gettime
получить системное время как структуру
setdate
установить системную дату
setftime
установить системное время
settime
установить системное время
stime
установить системное время
unixtodos
преобразовать время из формата ОС UNIX в формат ОС MS-DOS
Функции time и ftime возвращают текущее время как число секунд, прошедших с 1
января 1970 Гринвичского Всемирного времени. Эта величина может быть преобразована,
скорректирована и сохранена посредством функций asctime, ctime, gmtime и localtime.
Функция utime устанавливает время модификации для указанного файла, используя
текущее время или значение времени, заданное в структуре.
Функция ftime требует включения двух файлов: sys\types.h и sys\timeb.h. Прототип
функции ftime содержится в sys\timeb.h.
Функция utime также требует включения двух файлов: sys\types.h и sys\utime.h.
Прототип функции utime содержится в файле sys\utime.h.
Прототипы функций dostounix, getdate, gettime, setdate, settime, unixtodos
содержатся в файле dos.h.
Прототипы функций getftime и setftime определены в файле io.h.
Прототипы остальных функций работы со временем времени содержатся в файле
time.h.
При использования функции ftime или localtime, чтобы сделать поправку для
местного времени, необходимо определить переменную командного языка операционной
системы TZ.

9.13 Функции работы со списком аргументов
Функция
va_arg
va_end
va_start

Краткое описание
выбрать аргумент из списка
переустановить указатель
установить указатель на начало списка аргументов

Эти макроопределения дают возможность получить доступ к аргументам функции,
когда число аргументов переменно.

В системе программирования MSC для совместимости с ОС UNIX System V можно
использовать включаемый файл vararg.h, для совместимости со стандартом ANSI на язык
Си можно использовать включаемый stdarg.h. В этих файлах содержится две различных
версии макроопределений.
В системе программирования ТС доступна только версия stdarg.h.

9.14 Другие функции
Функция
assert
getenv
perror
putenv
swab
rand
srand
setjmp
longjmp

Краткое описание
проверка утверждения о состоянии переменных
получить значение переменной среды (окружения)
напечатать сообщение об ошибке
изменить значение переменной среды
поменять местами два смежных байта
получить псевдо-случайное число
инициализация датчика случайных чисел
запоминание точки для многоуровневого возврата
многоуровневый возврат из функции

Прототипы всех функций, исключая assert, longjmp и setjmp, описаны в stdiib.h.
Assert — это макроопределение из файла assert.h.
Прототипы функций setjmp и longjmp содержатся в файле setjmp.h.
Программы getenv и putenv предоставляют доступ к таблице среды процесса.
Глобальная переменная environ также указывает на таблицу среды, но рекомендуется
использование функций getenv и putenv для доступа и изменения установленной среды
вместо обращения к таблице среды напрямую.
perror
печатает
диагностическое
сообщение
о
последней
ошибке,
Функция
произошедшей при вызове какой-либо библиотечной функции.
Функция swab обычно используется для преобразования данных в формат других
компьютеров, где используется иной порядок следования байтов в слове в оперативной
памяти.