Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TCLR-1Ar.doc
Скачиваний:
26
Добавлен:
10.11.2018
Размер:
496.64 Кб
Скачать

Глава 1 библиотечные функции

----------------------------------------------------------

БИБЛИОТЕЧНЫЕ ФУНКЦИИ

--------------------

Все примеры программ из этой главы

содержатся во встроенной справочной

системе. Это означает, что вы може-

те просто скопировать их из нее и

вставить в свой файл.

Эта глава содержит подробное описание всех библиотечных

функций Turbo C++. Некоторые функции группируются в "семейства"

(например, функции exec... и spawn..., которые создают, загружа-

ют и запускают программы), т.к. они выполняют похожие или взаи-

мозависимые действия.

Мы же для каждой функции приводим отдельное описание. Например,

если вы хотите получить информацию о функции free, вы

будете искать именно free и в описании функции вы найдете следу-

ющую информацию:

- описание того, что делает функция free,

- синтаксис для вызова функции free,

- в каких включаемых файлах содержится прототип функции

free,

- детальное описание того, как работает free и как она вза-

имосвязана с другими функциями, предназначенными для вы-

деления памяти,

- список других компиляторов, которые имеют сходную функ-

цию,

- ссылки на взаимосвязанные функции Turbo C++,

- и, если необходимо, приводится пример использования этой

функции или ссылка на функцию, в описании которой приво-

дится необходимый пример.

Функция "main"

Каждая программа на Си должна иметь функцию main; причем

ваше дело, где вы ее поместите. Некоторые программисты помещают

ее в начале файла, некоторые в конце. Однако независимо от ее

положения необходимо помнить следующее:

Аргументы функции "main"

Запускающая программа Turbo C++ посылает функции main три

параметра (аргумента): argc, argv и env.

- argc, целое, - это число аргументов командной строки, по-

сылаемое функции main,

-13-

- argv это массив указателей на строки.

Под версией DOS 3.x argv[0] определяется как полный

маршрут запускаемой программы.

При работе под более ранними версиями DOS argv указы-

вает на нулевую строку ("").

argv[1] указывает на первую после имени программы стро-

ку командной строки.

argv[2] указывает на вторую после имени программы стро-

ку командной строки.

argv[argc-1] указывает на последний аргумент, посылае-

мый функции main.

argv[argc] содержит NULL.

- env также является массивом указателей на строки. Каждый

элемент env[] содержит строку вида ENVVAR=значение.

ENVVAR - это имя переменной среды, типа PATH или 87.

<значение> это значение данной переменной окружения,

например C:\DOS;C:\TURBOC (для PATH) или YES (для 87).

Заметим, однако, что если вы описываете некоторые из этих

аргументов, то вы должны описывать их в таком порядке: argc,

argv, env.

Например, допустимы следующие объявления аргументов:

main()

main(int argc) /* допустимо но не очень хорошо */

main(int argc, char *argv[])

main(int argc, char *argv[], char *env[])

Объявление main(int argc) не очень удобно тем, что зная ко-

личество параметров, вы не имеете доступа к ним самим.

Аргумент env всегда доступен через глобальную переменную

environ. Смотри описание переменной environ (в Главе 2) и функ-

ций putenv и getenv (в этой главе).

Параметры argc и argv также доступны через переменные_argc

и _argv.

Пример программы, использующей argc, argv и env.

Это пример программы ARGS.EXE, которая демонстрирует прос-

тейший путь использования аргументов, посылаемых функции main.

/* программа ARGS.C */

#include <stdio.h>

#include <stdlib.h>

void main(int argc, char *argv[], char *env[])

{

-14-

int i;

printf("Значение argc равно %d \n\n",argc);

printf("В командной строке содержится %d параметров \n\n",argc);

for (i=0; i<=argc; i++)

printf(" argv[%d]: %s\n",i,argv[i]);

printf("Среда содержит следующие строки:\n");

for (i=0; env[i] != NULL; i++)

printf(" env[%d]: %s\n",i,env[i]);

return 0;

}

Предположим, что вы запускаете программу ARGS.EXE со следу-

ющей командной строкой:

C:> args first_arg "arg with blanks" 3 4 "last but one" stop!

Заметим, что вы можете послать аргумент с пробелами, заклю-

чив его в двойные кавычки, как показано на примере "argument

with blanks" и "last but one" в примере вызова программы.

В результате работы программы вы получите примерно следую-

щее:

Значение argc равно 7

В командной строке содержится 7 параметров

argv[0]: c:\turboc\testargs.exe

argv[1]: first_arg

argv[2]: arg with blank

argv[3]: 3

argv[4]: 4

argv[5]: last but one

argv[6]: stop!

Среда содержит следующие строки:

env[0]: COMSPEC=C:\COMMAND.COM

env[1]: PROMPT=$p $g

env[2]: PATH=C:\SPRINT;C:\DOS;C:\TC

Максимальная общая длина командной строки, посылаемая функ-

ции main (включая пробелы и имя самой программы), не может пре-

вышать 128 символов; это ограничения DOS.

Символы маскирования в командной строке

Аргументы командной строки могут содержать символы маскиро-

вания. При этом они могут расширяться для всех имен файлов, ко-

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

командой DOS copy. Для использования символов маскирования необ-

ходимо при связывании вашей программы редактором связей подсое-

динить к ней объектный файл WILDARGS.OBJ, который поставляется с

Turbo C++.

Если файл WILDARGS.OBJ подсоединен к вашей программе, то

вы можете в командной строке использовать аргументы типа "*.*".

-15-

При этом имена всех файлов, подходящих к данной маске, заносят-

ся в массив argv. Максимальный размер массива argv зависит

только от объема heap - памяти.

Если под данную маску не нашлось подходящих файлов, то ар-

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

строке. (Т.е. функции main передается строка, содержащая символы

маскирования).

Аргументы, заключенные в двойные кавычки ("..."), не рас-

ширяются.

Пример. Следующие команды компилируют файл ARGS.C и связы-

вают его с модулем WILDARGS.OBJ, а затем запускают получившуюся

программу ARGS.EXE:

tcc args wildarg.obj

args C:\TC\INCLUDE\*.H "*.C"

При запуске ARGS.EXE первый аргумент расширяется до имен

всех файлов с расширением H в директории C:\TC\INCLUDE. Отметим,

что все строки включают полный маршрут (к примеру

C:\TC\INCLUDE\ALLOC.H). Аргумент *.C не расширяется, т.к. он

заключен в кавычки.

Если вы работаете в Интегрированном Окружении (TC.EXE), то

вам просто нужно указать в меню проекта имя файла проекта, ко-

торый должен содержать следующие строки:

ARGS

WILDARGS.OBJ

Затем с помощью команд "Run/Arguments" следует установить

параметры командной строки.

Замечание. Если вы хотите, чтобы обработка символов маски-

рования происходила всегда, т.е. чтобы WILDARGS.OBJ автомати-

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

вашу стандартную библиотеку C?.LIB, добавив в нее файл

WILDARGS.OBJ. Для этого удалите из библиотеки SETARGV и добавь-

те WILDARGS. Это можно сделать с помощью следующих команд (мы

подразумеваем, что стандартные библиотеки и WILDARGS.OBJ содер-

жатся в текущей директории):

TLIB описана в главе 5 "Утилиты" "User's Guide"

tlib cs -setargv +wildargs

tlib cc -setargv +wildargs

tlib cm -setargv +wildargs

tlib cl -setargv +wildargs

tlib ch -setargv +wildargs

Компиляция с использованием ключа -p (Соглашения о вызовах

языка Паскаль).

Если вы компилируете вашу программу, используя соглашения

о вызовах языка Паскаль (детально описано в главе 6

"Interfacing with assembly languige", "Programmer's Guide"), вы

должны помнить, что функция main должна быть явно объявлена как

-16-

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

примерно так:

cdecl main(int argc, char *argv[], char *env[])

Значение, возвращаемое функцией main.

Функция main возвращает значение, которое является кодом

завершения программы: это целое. Однако, если ваша программа

для завершения использует функцию exit (или _exit), то возвра-

щаемым значением будет аргумент этой функции.

Например, если ваша программа содержит вызов:

exit(1)

то код завершения будет равен 1.

Если для запуска программы вы используете интегрированное

окружение Turbo C++ (TC.EXE), то посмотреть возвращаемое значе-

ние функции main вы можете, выбрав "File | Get Info".

Описание библиотечных функций.

В нижеприведенном примере показано, как выглядит примерное

описание одной библиотечной функции.

----------------------------------------------------------------------

имя функции

----------------------------------------------------------------------

Функция Краткое описание того, что делает эта функция.

Синтаксис #include <header.h>

(Файлы заголовков, содержащие прототип для функции

или определения констант, перечисляемых типов и

т.д., используемые функцией).

function(modifier parameter[,...]);

(Это описание синтаксиса для функции; [,...] озна-

чает, что могут присутствовать другие параметры).

Файл, содержащий header.h

прототип (Файлы заголовков, содержащие прототип для функции.

Прототип некоторых функций содержится в нескольких

файлах заголовков; в этом случае перечисляются все

файлы).

Описание Здесь описывается, что делает функция, параметры,

которые она использует, некоторые подробнос-

ти, которые могут вас заинтересовать, а так-

же перечислены родственные функции.

Возвращаемое Приводится значение, которое функция

значение возвратит, если оно существует. Если используется

глобальная переменная errno, то приводится

также ее значение приводится.

Переносимость Определяет системы и языки, в которых доступна

функция. Это может быть UNIX, IBM PC и совместимые

компьютеры, а также стандарт ANSI С.

-17-

Смотрите также Перечисляются другие функции, которые вас

могут заинтересовать. Примечание: Если имя функции

содержит перечисление (funcname..., ...funcname,

func...name), то это значит, что имеет место семей-

ство функций (например, exec... ссылается на целое

семейство функций: execl, execle, execlpe, execv,

execve, execvp и execvpe).

Пример /* Здесь вы найдете пример маленькой программы,

которая иллюстрирует использование этой (и, воз-

можно, связанных с ней) функции. */

abort

Функция Ненормальное завершение выполнения программы.

Синтаксис: #include<stdlib.h>

void abort(void);

Файл, содержащий stdlib.h,process.h

прототип

Описание Данная функция выводит сообщение о прекращении

работы ("Abnormal program termination") в stderr, и

прерывает программу посредством вызова функции

_exit с кодом завершения 3.

Возвращаемое Возвращает код завершения 3 в родительский процесс

значение или в DOS.

Переносимость Поддерживается в системах UNIX и определена в ANSI

C.

Смотрите также assert, atexit, exit, _exit, raise, signal, spawn...

Пример:

#include<stdio.h>

#include<stdlib.h>

int main(void)

{

printf("Вызов функции abort()\n");

abort();

return 0; /* эта точка не достигается */

}

abs

Функция Возвращает абсолютное значение целого числа.

Синтаксис Версия для вещественных Версия для комплексных

#include <math.h> #include<complex.h>

int abs(int x); double abs(complex x);

Файл, содержащий Версия для вещественных Версия для комплексных

прототип math.h, stdlib.h complex.h

Описание Функция abs возвращает абсолютное значение целого

аргумента x. Если функция abs вызывается при под-

ключенном файле stdlib.h, abs будет восприниматься

как макрокоманда, которая расширяется до встроен-

ного кода.

-18-

Если вы используете функцию abs вместо макрокоманды, то

включите в вашу программу #undef abs после

#include <stdlib.h>.

Возвращаемое Версия для вещественных чисел функции abs возвращает

значение целое значение в диапазоне от 0 до 32767, за исклю-

чением того, что аргумент -32768 будет возвращен,

как -32768. Комплексная версия abs возвращает зна-

чение типа double.

Переносимость Вещественная версия abs доступна в системе UNIX и

определена в ANSI C. Комплексная версия abs требует

С++ и, скорее всего, непереносима.

Смотрите также cabs, complex, fabs, labs.

Пример:

#include<stdio.h>

#include<math.h>

int main(void)

{

int number = -1234;

printf("число: %d абсолютное значение: %d\n",number,abs(number));

return 0;

}

absread

Функция Чтение абсолютных секторов на диске.

Синтаксис #include<dos.h>

int absread(int drive, int nsects,

int lsect, void * buffer);

Файл, содержащий dos.h

прототип

Описание absread считывает заданные сектора диска. Функция

игнорирует логическую структуру диска и не обращают

внимание на файлы, блоки FAT или директории.

аbsread читает заданные сектора диска посредст-

вом прерывания DOS 0x25.

drive = номер читаемого диска (0=А, 1=В, и т.д.)

nsects = количество читаемых секторов

lsect = начальный логический номер сектора

buffer = адрес памяти, куда считываются данные.

Количество считываемых секторов ограничено суммар-

ным размером сегмента памяти, расположенного выше

адреса buffer. Таким образом, 64К - максимальный

размер области памяти, который может быть обработан

за один вызов функции absread.

Возвращаемое При успешном завершении absread возвращает 0.

значение При возникновении ошибки, функция возвращает

значение -1 и присваивают переменной errno значе-

-19-

ние регистра AX, получаемое при системном вызове.

Переносимость absread уникальна для DOS.

Смотри также abswrite, biosdisk.

Пример:

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<dos.h>

#include<ctype.h>

#define SEGSIZE 512

unsigned char buf[SEGSIZE];

int main(void)

{

int i,j,sector,drive;

char str[10];

printf("Введите метку диска:");

gets(str);

drive = toupper(str[0])-'A';

printf("Введите номер сектора, который нужно считать:");

gets(str);

sector = atoi(str);

if(absread(drive,1,sector,&buf)!=0)

{

perror("Ошибка диска")ж

exit(1);

}

printf("\nДисковод %c Сектор %d\n",'A'+drive,sector);

for(i=0; i<SEGSIZE; i+=16)

{

if((i/16)==20)

{

printf("Для продолжения нажмите любую клавишу");

getch();

printf("\n");

}

printf("%03d",i);

for(j=0;j<16;j++)

printf("%02X ",buf[i+j]);

printf("\t");

for(j=0; j<16;j++)

if(isprint(buf[i+j]))

printf("%c",buf[i+j]);

else

printf(".");

}

return 0;

}

abswrite

Функция Запись абсолютных секторов на диск.

Синтаксис #include<dos.h>

int abswrite(int drive, int nsects,

int lsect, void * buffer);

-20-

Файл, содержащий dos.h

прототип

Описание abswrite записывает заданные сектора диска. Функ-

ция игнорирует логическую структуру диска и не об-

ращает внимание на файлы, блоки FAT или директо-

рии.

Примечание. При неверном использовании abswrite

может перезаписать файлы, директории или блоки

FAT.

аbswrite произвадит запись секторов диска посредс-

твом прерывания DOS 0x26.

drive = номер диска, на который производится за-

пись (0=А, 1=В, и т.д.)

nsects = количество записываемых секторов

lsect = начальный логический номер сектора

buffer = адрес памяти, откуда ,берутся данные.

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

ным размером сегмента памяти, расположенного выше

адреса buffer. Таким образом, 64К - максимальный

размер области памяти, который может быть обработан

за один вызов функции abswrite.

Возвращаемое При успешном завершении abswrite возвращает 0.

значение При возникновении ошибки, функция возвращает

значение -1 и присваивает переменной errno значе-

ние регистра AX, получаемое при системном вызове.

Более детальную информацию об еrrno смотрите в

документации по DOS.

Переносимость abswrite уникальна для DOS.

Смотрите также absread, biosdisk.

access

Функция Определяет возможность доступа к файлу.

Синтаксис #include<io.h>

int access(const char * filename, int amode);

Файл, содержащий io.h

прототип

Описание access проверяет файл c именем filename для

определения, существует ли он, может ли он быть

прочитан, записан или выполнен.

Список значений параметра amode:

06 проверка разрешения на чтение и запись;

04 проверка разрешения на чтение;

02 проверка разрешения на запись;

01 проверка на выполнение (игнорируется);

00 проверка на существование файла;

Примечание. Под управлением операционной системы

DOS все существующие файлы имеют доступ на чтение

-21-

(amode равен 04), поэтому 00 и 04 дают один и тот

же результат. Аналогично, значения 06 и 02 эквивалентны,

так как в DOS доступ на запись подразумевает и доступ на

чтение.

Если параметр filename является ссылкой на дирек-

торию, функция access просто проверяет, существует

данная директория или нет.

Возвращаемое Если требуемый способ доступа разрешен, access

значение возвращает значение 0, иначе возвращается значение

-1 и переменная errno получает одно из следующих

значений:

ENOENT - Маршрут или имя файла не найдены

EACCES - Отказ доступа.

Переносимость Поддерживается на системах UNIX.

Смотрите также chmod, fstat, stat.

Пример:

#include <stdio.h>

#include <io.h>

int file_exists(char * filename);

int main(void)

{

printf("Существует ли файл NOTEXIST.FIL: %s\n",

file_exists("NOTEXIST.FIL") ? "Да":"Нет");

}

int file_exists(char * filename)

{

return (access(filename, 0) == 0);

}

Результат:

Существует ли файл NOTEXIST.FIL: Нет

acos

Функция Вычисляет арккосинус.

Синтаксис Версия для вещественных Версия для комплексных

#include <math.h> #include<complex.h>

double acos(double x); complex acos(complex x);

Файл, содержащий Версия для вещественных Версия для комплексных

прототип math.h complex.h

Описание acos возвращает арккосинус введенного значения. Ар-

гументы acos должны быть в диапазоне от -1 до 1.

Иначе acos возвращает NAN и устанавливает errno в

EDOM - Ошибка области определения

Комплексный обратный косинус определяется следующим

образом:

-22-

acos(z)=-i*log(z+i*sqrt(1-z^2))

Возвращаемое Вещественная версия acos возвращает значение в диа-

значение пазоне от 0 до pi. Управление ошибками для этой фун-

кции можно изменить с помощью функции matherr.

Переносимость Вещественная версия acos поддерживается в системах

UNIX и определена в ANSI C. Комплексная версия acos

требует С++ и, скорее всего, непереносима.

Смотрите также asin,atan,atan2,complex,cos,matherr,sin,tan

Пример:

#include<stdio.h>

#include<math.h>

int main(void)

{

double result;

double x=0.5;

result = acos(x);

printf("Арккосинус от %1f равен %1f\n",x,result);

return 0;

}

allocmem

Функция Выделяет сегмент памяти DOS.

Синтаксис #include<dos.h>

int allocmem(unsigned size, unsigned *segp);

Файл, содержащий dos.h

прототип

Описание allocmem для выделения блока свободной

памяти использует системный вызов DOS 0x48 и возв-

ращает в качестве результата адрес сегмента выде-

ленного блока.

size - желаемый размер области памяти в параграфах

(параграф равен 16 байт).

segp - указатель на слово, которому будет присвоен

адрес сегмента нового выделенного блока памяти.

Присваивания не происходит, если запрашиваемого

количества памяти не имеется в наличии.

Все выделяемые блоки выравниваются по параграфам.

allocmem и malloc не могут использоваться вместе.

Возвращаемое allocmem при успешном завершении возвра-

значение щает значение -1. При возникновении ошибки

возвращается число (размер в параграфах наибольше-

го блока памяти, имеющегося в наличии).

Ошибка, возвращаемая из allocmem, устанавливает

_doserrno и глобальную переменную errno в

ENOMEM - Не хватает памяти

-23-

Переносимость allocmem уникальна для DOS.

Смотрите также coreleft,freemem,malloc,setblock.

Пример:

#include<dos.h>

#include<alloc.h>

#include<stdio.h>

int main(void)

{

unsigned int size,segp;

int stat;

size = 64; /* 64 * 16 = 1024 байта */

stat = allocmem(size,&segp);

if(stat == -1)

printf("Выделен сегмент памяти по адресу %x\n",segp);

else

printf("Ошибка! Допустимый максимальный размер = %u\n",stat);

return 0;

}

arc

Функция Рисует дугу окружности.

Синтаксис #include <graphics.h>

void far arc(int x,int y,int stangle,

int endangle,int radius);

Файл, содержащий graphics.h

прототип

Описание arc рисует текущим цветом дугу окружности с цент-

ром в точке с координатами (x,y) и радиусом

radius . Дуга рисуется от угла stangle до угла

endangle. Если stangle равен 0 и endangle равен

360, функция arc нарисует полную окружность.

Угол для arc отсчитывается против часовой стрелки,

где 0 градусов соответствует 3 часам на цифербла-

те, 90 градусов - 12 часам и т.д.

Замечание. Параметр linestyle не оказывает воздей-

ствие при построении дуг, окружностей, эллипсов и

секторов. Используется только параметр thickness.

Замечание. Если вы используете CGA в режиме высо-

кого разрешения или монохромный графический адап-

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

приведенные в этой книге, могут не дать ожидаемого

результата. Если ваша система работает на CGA или

монохромном адаптере, передайте значение 1 тем

функциям, которые изменяют цвет закрашивания или

рисования, (например, setcolor, setfillstyle и

setlinestyle) вместо символической константы цвета

(определенной в graphics.h).

Возвращаемое Нет.

значение

-24-

Переносимость Эта функция уникальна для Turbo C++. Она работа-

ет только на компьютерах IBM PC и совместимых с

ними, оснащенных дисплейными адаптерами, поддержи-

вающими графический режим.

Смотрите также circle, ellipse, fillelipse, getarccoords,

getaspectratio, graphresult, pieslice, sector.

Пример:

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

int main(void)

{

/* Запрос автоопределения */

int graphdriver = DETECT, gmode, errorcode;

int midx,midy;

int stangle = 45,endangle = 135;

int radius = 100;

/* инициализация графики и локальных переменных */

initgraph(&graphdriver,&gmode,"");

/* получение результата инициализации */

errorcode = graphresult();

if(errorcode != grOk) /* если ошибка */

{

printf("Ошибка :%s\n",grapherrormessage(errorcode));

printf("Для останова нажмите любую клавишу\n");

getch();

exit(1); /* завершение с кодом ошибки */

}

midx = getmaxx() / 2;

midy = getmaxy() / 2;

setcolor(getmaxcolor(1));

/* рисует дугу */

arc(midx,midy,stangle,endangle,radius);

/* очистка */

getch();

closegraph();

return 0;

}

arg

Функция Возвращает угол числа на комплексной плоскости.

Синтаксис #include<complex.h>

double arg(complex x);

Файл, содержащий complex.h

прототип

Описание arg возвращает в радианах угол числа на комплекс-

ной плоскости.

Положительное направление вещественной оси имеет

-25-

угол 0, а положительное направление мнимой оси

имеет угол Pi. Если аргумент, передаваемый функ-

ции, равен комплексному 0 (ноль), то arg возвраща-

ет 0.

Возвращаемое arg(x) возвращает atan2(imag(x),real(x)).

значение

Переносимость Функции комплексных чисел требуют С++ и поэтому не-

переносимы.

Смотри также complex, norm, polar.

Пример:

#include<iostream.h>

#include<complex.h>

int main(void)

{

double x = 3.1, y = 4.2;

complex z = complex(x,y);

cout << "z =" << z << "\n";

cout << "имеет вещественную часть = " << real(z) << "\n";

cout << "и мнимую часть = " << imag(z) << "\n";

cout << "z имеет комплексное сопряжение = " << conj(z) << "\n";

double mag = sqrt(norm(z));

double ang = arg(z);

cout << "Полярная форма z:\n"

cout << "Величина = " << mag << "\n";

cout << "Угол (в радианах) = " << ang << "\n";

cout << "Восстановление из полярной формы: \n";

cout << " z = " << polar(mag,ang) << "\n";

return 0;

}

asctime

Функция Преобразует дату и время в код ASCII.

Синтаксис #include <time.h>

char * asctime(const struct tm * tblock);

Файл, содержащий time.h

прототип

Описание asctime преобразует время, содержащееся в виде

структуры в *tblock, в 26-символьную строку такой

же формы, как и в функции ctime:

Sun Sep 16 01:03:52 1973\n\0

Возвращаемое asctime возвращает указатель на символьную строку,

значение содержащую дату и время. Эта строка является стати-

ческой переменной, которая изменяет свое значение

при каждом вызове функции asctime.

Переносимость Поддерживается в системах UNIX и определена в

ANSI C.

-26-

Смотрите также ctime, difftime, ftime, gmtime, localtime, mktime,

strtime, stime, time, tzset

Пример:

#include <stdio.h>

#include <string.h>

#include <time.h>

int main(void)

{

struct tm t;

char str[80];

/* простейшее заполнение структуры */

t.tm_sec = 1; /* секунды */

t.tm_min = 30; /* минуты */

t.tm_hour = 9; /* часы */

t.tm_mday = 22; /* день месяца */

t.tm_mon = 11; /* месяц */

t.tm_year = 56; /* год не включает век */

t.tm_wday = 4; /* день недели */

t.tm_yday = 0; /* не отображается в asctime */

t.tm_isdst = 0; /* летнее время, не отобра-

жается asctime */

/* преобразование структуры в строку оканчиваю-

щуюся нулем */

strcopy(str,asctime(&t));

printf("%s\n",str);

return 0;

}

asin

Функция Вычисляет арксинус.

Синтаксис Версия для вещественных Версия для комплексных

#include <math.h> #include<complex.h>

double asin(double x); complex asin(complex x);

Файл, содержащий Версия для вещественных Версия для комплексных

прототип math.h complex.h

Описание Версия asin для вещественных чисел возвращает арк-

синус введенного значения. Аргументы функции asin

должны находиться в диапазоне от -1 до 1, в про-

тивном случае asin возвращает NAN и устанавливает

errno в

EDOM - Ошибка области определения.

Комплексный арксинус определяется следующим обра-

зом:

asin(z) = -i*log(i*z+sqrt(1-z^2))

Возвращаемое Вещественная версия asin возвращает значение в диа-

значение пазоне от -pi/2 до pi/2. Обработку ошибок для

этой функции можно изменить с помощью функции

matherr.

-27-

Переносимость Поддерживается в системах UNIX и определена в ANSI

C. Комплексная версия asin требует С++ и скорее

всего непереносима.

Смотрите также acos, atan, atan2, complex, cos, matherr, sin, tan.

Пример:

#include <stdio.h>

#include <math.h>

int main(void)

{

double result;

double x = 0.5;

result = asin(x);

printf("Арксинус от %1f равен %1f\n",x,result);

return 0;

}

assert

Функция Проверяет условия и возможность прерывания выполне-

ния программы.

Синтаксис #include <assert.h>

void assert(int test);

Файл, содержащий assert.h

прототип

Описание Функция assert представляет собой макрокоманду,

которая расширяется до оператора if; если параметр

test принимает нулевое значение, то assert прерыва-

ет программу (при помощи вызова abort) и выводит

сообщение в stderr.

assert выводит следующее сообщение:

Assertion failed: <test>, file <filename>, line <linenum>

Позиции filename и linenum, перечисленные в сообще-

нии, являются именем исходного файла и номером

строки программы, в которой появляется макрокоманда

assert.

Если в исходный код программы вы вставите перед

оператором #include <assert.h> оператор #define

NDEBUG ("без отладки"), то функция assert будет

воспринята как комментарий.

Возвращаемое Нет.

значение

Переносимость Данная макрокоманда поддерживается на некоторых

системах UNIX, включая Systems III и V, совместима

с ANSI C.

Смотрите также abort.

Пример:

-28-

#include <assert.h>

#include <stdio.h>

#include <stdlib.h>

struct ITEM {

int key;

int value;

};

/* Добавление элемента в список.

Проверка, является ли элемент ненулевым */

void additem(struct ITEM *itemptr)

{

assert(itemptr != NULL);

/*... добавление элемента ... */

}

int main(void)

{

additem(NULL);

return 0;

}

Результат

Assertion failed: itemptr != NULL,

file C:\TC\ASSERT.C, line 12

atan

Функция Вычисляет арктангенс.

Синтаксис Версия для вещественных Версия для комплексных

#include <math.h> #include<complex.h>

double atan(double x); complex atan(complex x);

Файл, содержащий Версия для вещественных Версия для комплексных

прототип math.h complex.h

Описание atan возвращает арктангенс введенного значения.

Комплексный арктангенс определяется следующим обра-

зом:

atan(z) = -0.5*i*log((1+i*z)/(1-i*z))

Возвращаемое Вещественная версия atan возвращает значение в диа-

значение пазоне от -pi/2 до pi/2. Обработку ошибок для этой

функции можно изменить с помощью функции matherr.

Переносимость Вещественная версия atan поддерживается в системах

UNIX и определена в ANSI C. Комплексная версия

требует С++ и, скорее всего, непереносима.

Смотрите также acos, asin, atan2, complex, cos, matherr,sin, tan:

Пример:

#include <stdio.h>

-29-

#include <math.h>

int main(void)

{

double result;

double x = 0.5;

result = atan(x);

printf("Арктангенс от %1f равен %1f\n",x,result);

return 0;

}

atan2

Функция Вычисляет арктангенс от y/x.

Синтаксис #include <math.h>

double atan2(double y, double x);

Файл, содержащий math.h

прототип

Описание atan2 возвращает арктангенс от y/x и производит

корректировку результата, даже если результирую-

щий угол близок к pi/2 или -pi/2 (x близок к 0).

Если и x и y установлены в 0, то функция устанавли-

вает errno в EDOM.

Возвращаемое atan2 возвращает значение в диапазоне от -pi до pi.

значение Обработку ошибок для этой функции можно изменить

с помощью функции matherr.

Переносимость Поддерживается в системах UNIX и определена в ANSI

C.

Смотрите также acos, asin, atan, cos, matherr, sin, tan.

Пример:

#include <stdio.h>

#include <math.h>

int main(void)

{

double result;

double x = 90.0,y = 15.0;

result = atan2(x,y);

printf("Арктангенс от отношения %1f равен %1f\n",(x/y),result);

return 0;

}

-30-

atexit

Функция Регистрирует функцию завершения работы.

Синтаксис #include<stdlib.h>

int atexit(atexit_t func)

Файл, содержащий stdlib.h

прототип

Описание Функция atexit регистрирует функцию, указателем

которой является переменная func, как функцию вы-

хода из программы. При нормальном завершении прог-

раммы функция exit вызывает функцию (*func)() пе-

ред возвратом в операционную систему.

Каждый вызов функции atexit регистрирует разные

функции выхода. Может быть зарегистрировано до 32

функций. Они выполняются в следующем порядке -

последняя регистрируемая выполняется первой.

Возвращаемое Функция atexit возвращает 0 при успешном заверше-

значение нии и ненулевое значение при неудачном завершении

(не остается памяти, чтобы регистрировать функ-

цию).

Переносимость atexit совместима с ANSI C.

Смотрите также abort, _exit, exit, spawn...

Пример:

#include <stdlib.h>

#include <stdio.h>

void exit_fnl(void)

{

printf("Функция выхода 1\n");

}

void exit_fn2(void)

{

printf("Функция выхода 2\n");

}

int main(void)

{

/* послать функцию выхода */

atexit(exit_fn1);

/* послать функцию выхода */

atexit(exit_fn2);

printf("Завершение main ...\n");

return 0;

}

atof

Функция Преобразует строку в число с плавающей точкой.

Синтаксис #include <math.h>

double atof(const char * s);

-31-

Файл, содержащий math.h, stdlib.h

прототип

Описание Функция atof преобразует символьную строку,

адресный указатель которой находится в аргументе

s, в число с двойной точностью (тип double); дан-

ная функция распознает символьное представление

числа с плавающей точкой следующего вида:

- необязательная строка табуляции и пробелов;

- необязательный знак;

- строку цифр и необязательную десятичную точку

(цифры могут находиться с обеих сторон от точки)

- необязательные символы e или E, за которыми сле-

дует необязательное целое со знаком

Символы должны соответствовать следующему формату:

[пробелы] [знак] [ddd] [.] [ddd] [e|E[знак]ddd]

atof также распознает +INF и -INF для плюс и минус

бесконечности, +NAN и -NAN для нечисловых значений.

Эта функция прекращает преобразование на первом не-

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

strtod аналогична atof; она дает лучшее распознава-

ние ошибок, и поэтому в некоторых случаях предпочти-

тельнее.

Возвращаемое atof возвращает преобразованное значение

значение входной символьной строки.

В случае переполнения atof возвращает положитель-

ное или отрицательное значение HUGE_VAL, глобаль-

ная переменная errno устанавливается в ERANGE и

функция matherr не вызывается.

Переносимость Поддерживается в системах UNIX и определена в ANSI

C.

Смотрите также atoi, atol, ecvt, fcvt, gcvt, scanf, strtod.

Пример:

#include<stdlib.h>

#include<stdio.h>

int main(void)

{

float f;

char *str = "12345.678";

f = atof(str);

printf("строка = %s значение = %5.3f\n",str,f);

return 0;

}

atoi

Функция Преобразует строку в целое число.

-32-

Синтаксис #include<stdlib.h>

int atoi(const char *s);

Файл, содержащий stdlib.h

прототип

Описание Функция atoi преобразует символьную строку,

адресный указатель которой находится в аргументе

s, в число типа int; данная функция распознает (в

следующем порядке):

- необязательную строку табуляции и пробелов;

- необязательный знак;

- строку цифр.

Символы должны соответствовать следующему формату:

[пробелы] [знак] [ddd]

Эта функция прекращает преобразование на первом не-

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

atoi не отслеживает переполнение.

Возвращаемое atoi возвращает преобразованное значение

значение входной символьной строки. Если строка не может

быть преобразована в число соответствующего типа

(int), то возвращаемое значение равно 0.

Переносимость Поддерживается в системах UNIX и определена в ANSI

C.

Смотрите также atof, atol, ecvt, fcvt, gcvt, scanf, strtod.

Пример:

#include<stdlib.h>

#include<stdio.h>

int main(void)

{

int n;

char *str = "12345";

n = atoi(str);

printf("строка = %s целое = %d\n",str,n);

return 0;

}

atol

Функция Преобразует строку в число типа long.

Синтаксис #include <stdlib.h>

long atol(const char * s);

Файл, содержащий stdlib.h

прототип

Описание Функция atol преобразует символьную строку,

адресный указатель которой находится в аргументе

s, в число типа long. Данная функция распознает в

-33-

следующем порядке:

- необязательную строку табуляции и пробелов;

- необязательный знак;

- строку цифр.

Символы должны соответствовать следующему формату:

[пробелы] [знак] [ddd]

Эта функция прекращает преобразование на первом не-

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

atol не отслеживает переполнение (результат не опре-

делен).

Возвращаемое atol возвращает преобразованное значение

значение входной символьной строки. Если строка не может

быть преобразована в число соответствующего типа

(long), то возвращаемое значение равно 0.

Переносимость Поддерживается в системах UNIX и определена ANSI

C.

Смотрите также atof, atoi, ecvt, fcvt, gcvt, scanf, strtod, strtol,

strtoul.

Пример:

#include<stdlib.h>

#include<stdio.h>

int main(void)

{

int n;

char *str = "12345";

n = atoi(str);

printf("строка = %s целое = %d\n",str,n);

return 0;

}

bar

Функция Рисует прямоугольник.

Синтаксис #include <graphics.h>

#include <conio.h>

void far bar(int left,int top,int right,int

bottom);

Файл, содержащий graphics.h

прототип include <conio.h>

Описание bar рисует двухмерный заполненный прямоугольник.

Прямоугольник зарисовывается, используя текущий

цвет и шаблон заполнения. bar не рисует контур

прямоугольника; для того, чтобы нарисовать контур

двухмерного прямоугольника, используйте функцию

bar3d, с параметром depth равным 0.

Верхний левый и нижний правый углы прямоугольника

-34-

заданы параметрами (left,top) и (right,bottom)

соответствено. Координаты даются в пикселях.

Возвращаемое Нет.

значение

Переносимость Функция уникальна для Turbo C++. Эта функция рабо-

тает только на компьютерах IBM PC и совместимых с

ними, оснащенных дисплейными адаптерами, поддержи-

вающими графический режим.

Смотрите также bar3d, rectangle, setcolor, setfillstyle,

setlinestyle.

Пример:

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

int main(void)

{

/* Запрос автоопределения */

int graphdriver = DETECT, gmode, errorcode;

int midx,midy,i;

/* инициализация графики и локальных переменных */

initgraph(&graphdriver,&gmode,"");

/* получение результата инициализации */

errorcode = graphresult();

if(errorcode != grOk) /* если ошибка */

{

printf("Ошибка :%s\n",grapherrormessage(errorcode));

printf("Для останова нажмите любую клавишу\n");

getch();

exit(1); /* завершение с кодом ошибки */

}

midx = getmaxx() / 2;

midy = getmaxy() / 2;

/* цикл по шаблонам заполнения */

for(i=SOLID_FILL; i<USER_FILL; i++)

{

/* установить тип заполнения */

setfillstyle(i,getmaxcolor());

/* нарисовать прямоугольник */

bar(midx - 50, midy - 50, midx + 50, midy+50);

getch();

}

/* очистить */

getch();

closegraph();

result 0;

}

-35-

bar3d

Функция Рисует трехмерный столбец.

Синтаксис #include <graphics.h>

void far bar3d(int left, int top,

int right, int bottom,

int depth, int topflag);

Файл, содержащий graphics.h

прототип

Описание bar3d рисует трехмерный прямоугольный столбец,

затем закрашивает его, используя текущий шаблон и

цвет заполнения. Трехмерный контур столбца рису-

ется текущим цветом и типом линии. Глубина столб-

ца в точках экрана задается параметром depth. Па-

раметр topflag определяет, будет ли рисоваться

вершина трехмерного столбца. Если topflag не 0,

вершина рисуется, в противном случае вершина не

рисуется. (создается возможность ставить несколь-

ко столбцов друг на друга.)

Верхний левый и нижний правый угол прямоугольника

задаются (left, top) и (right,bottom) соответст-

венно.

Для вычисления типичной глубины для bar3d возьми-

те 25% ширины столбца, например:

bar3d(left,top,right,bottom,(right-left)/4,1)

Возвращаемое Нет.

значение

Переносимость Функция уникальна для Turbo C++. Эта функция рабо-

тает только на компьютерах IBM PC и совместимых с

ними, оснащенных дисплейными адаптерами, поддержи-

вающими графический режим.

Смотрите также bar, rectangle, setcolor, setfillstyle,

setlinestyle.

Пример:

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

int main(void)

{

/* Запрос автоопределения */

int graphdriver = DETECT, gmode, errorcode;

int midx,midy,i;

/* инициализация графики и локальных переменных */

initgraph(&graphdriver,&gmode,"");

/* получение результата инициализации */

errorcode = graphresult();

if(errorcode != grOk) /* если ошибка */

-36-

{

printf("Ошибка :%s\n",grapherrormessage(errorcode));

printf("Для останова нажмите любую клавишу\n");

getch();

exit(1); /* завершение с кодом ошибки */

}

midx = getmaxx() / 2;

midy = getmaxy() / 2;

/* цикл по шаблонам заполнения */

for(i=SOLID_FILL; i<USER_FILL; i++)

{

/* установить тип заполнения */

setfillstyle(i,getmaxcolor());

/* нарисовать трехмерный столбец */

bar3d(midx - 50, midy - 50, midx + 50, midy+50, 10, 1);

getch();

}

/* очистить */

closegraph();

result 0;

}

bcd

Функция Преобразует число в двоично-десятичный код.

Синтаксис #include<bcd.h>

bcd bcd(int x);

bcd bcd(double x);

bcd bcd(double x, int decimals);

Файл, содержащий bcd.h

прототип

Описание Все обычные арифметические операции переопределены

для работы с числами в двоично-десятичном кодиро-

вании (BCD). BCD числа имеют около 17 десятичных

разрядов и имеют диапазон представления от

1х10^-125 до 1x10^125. Для преобразования числа в

BCD кодировании обратно в float, double или long

double можно воспользоваться функцией real. Аргу-

мент desimals необязателен. Он определяет сколько

необходимо сохранить разрядов после десятичной

точки при преобразовании. Число округляется в со-

ответствии с правилами округления банкомета, по

которым число округляется до ближайшего целого

числа, а остаток округляется до четной цифры.

Возвращаемое Двоично-десятичный эквивалент данного числа.

значение

Переносимость bcd уникальна для Turbo C++; вы должны компилиро-

вать с помощью С++.

Смотри также real.

Пример:

-37-

#include<iostream.h>

#include<bcd.h>

double x = 1000.0; // десять тысяч долларов

bcd a = bcd(x/3,2); // одна треть, округленная до

// одной сотой

int main(void)

{

cout << "пай = $" << a << "\n";

return 0;

}

bdos

Функция Доступ к системным вызовам DOS.

Синтаксис #include <dos.h>

int bdos(int dosfun, unsigned dosdx,

unsigned dosal);

Файл, содержащий dos.h

прототип

Описание bdos обеспечивает прямой доступ ко многим систем-

ным вызовам DOS. Описание всех системных вызовов

вы найдете в документе "Справочное руководство по

DOS".

В системных вызовах, требующих целый аргумент,

используйте функцию bdos; если в качестве аргу-

мента они требуют указатель, то используйте функ-

цию bdosptr.

Для моделей данных large (compact, large, huge)

предпочтительнее использовать для системных вызо-

вов функцию bdosptr вместо bdos с адресным указа-

телем в качестве аргумента.

dosfun описан в документе "Справочное руководство

по DOS".

dosdx является значением регистра DX.

dosal является значением регистра AL.

Возвращаемое Функция bdos возвращает значение регистра AX,

значение устанавливаемое при системном вызове.

Переносимость bdos уникальна для DOS.

Смотрите также bdosptr, geninterrupt, int86, int86x, intdos,

intdosx.

Пример:

#include <stdio.h>

#include <dos.h>

/* получение текущего устройства, как 'A','B',...*/

char current_drive(void)

-38-

{

char curdrive;

/* получение текущего диска, как 0,1,...*/

curdrive = bdos(0x19,0,0);

return('A' + curdrive);

}

main()

{

printf("Текущий дисковод %c:\n",

current_drive());

}

Результат

Текущий дисковод C:

bdosptr

Функция Доступ к системным вызовам DOS.

Синтаксис #include <dos.h>

int bdosptr(int dosfun, void * argument,

unsigned dosal);

Файл, содержащий dos.h

прототип

Описание bdosptr обеспечивает прямой доступ ко многим сис-

темным вызовам DOS. Описание всех системных вызо-

вов вы найдете в документе "Справочное руководст-

во по DOS".

В системных вызовах, требующих целый аргумент,

используйте функцию bdos; если в качестве аргу-

мента они требуют указатель, то используйте функ-

цию bdosptr.

Для моделей данных large (compact, large, huge)

предпочтительнее использовать для системных вызо-

вов функцию bdosptr вместо bdos с адресным указа-

телем в качестве аргумента.

dosfun описан в документе "Справочное руководство

по DOS".

В моделях данных типа small параметр argument в

bdosptr задает DX; в моделях данных типа large он

задает значение DS:DX, используемое в системном

вызове.

dosal является значением регистра AL.

Возвращаемое Функция bdosptr возвращает значение регистра AX

значение при успешном завершении и значение -1 при неудач-

ном завершении. При неудачном завершении устанав-

ливаются значения переменных errno и _doserrno.

Переносимость bdosptr уникальна для DOS.

Смотрите также bdos, geninterrupt, int86, int86x, intdos, intdosx.

-39-

Пример:

#include <string.h>

#include <stdio.h>

#include <dir.h>

#include <dos.h>

#include <errno.h>

#include <stdlib.h>

#define BUFLEN 80

int main(void)

{

char buffer[BUFLEN];

int test;

printf("Введите полный маршрут директории:");

gets(buffer);

test = bdosptr(0x3b,buffer,0);

if(test)

{

/* в errno.h приведен список кодов ошибок */

printf("Ошибка DOS, номер: %d\n",errno);

exit(1);

}

getcwd(buffer,BUFLEN);

printf("Текущая директория: %s\n",buffer);

return 0;

}

bioscom

Функция Выполняет ввод/вывод из последовательного порта.

Синтаксис #include<bios.h>

int bioscom(int cmd, char abyte, int port);

Файл, содержащий bios.h

прототип

Описание Функция bioscom выполняет разнообразную связь через

RS232 при помощи порта ввода/вывода, указываемого

в аргументе port.

Значение 0 аргумента port соответствует COM1,

значение 1 соответствует COM2 и т.д.

Значение аргумента cmd может быть одним из следу-

ющих:

0 - устанавливает параметры связи в abyte;

1 - пересылает символ в abyte по линии связи;

2 - получает символ по линии связи;

3 - возвращает текущее состояние коммуникационного

порта.

abyte является комбинацией следующих битов (из

каждой группы выбирается одно значение):

0x02 - 7 битов данных 0x00 110 бод

0x03 - 8 битов данных 0x20 150 бод

-40-

0x00 - 1 стоп-бит 0x40 300 бод

0x04 - 2 стоп-бита 0x60 600 бод

0x00 - нет проверки на четность 0x80 1200 бод

0x08 - проверка на нечетность 0xA0 2400 бод

0x18 - проверка на четность 0xC0 4800 бод

0xE0 9600 бод

Например, если abyte имеет следующее значение

0xEB (0xE0|0x08|0x00|0x03), то это устанавливает

для коммуникационного порта скорость передачи

9600 бод, контроль на нечетность, 1 стоп-бит, и 8

битов данных. bioscom использует прерывание BIOS

0x14.

Возвращаемое Для всех значений cmd bioscom возвращает шестнадца-

значение тибитовое целое число, где 8 старших бит - это биты

состояния, а 8 младших битов варьируются в зави-

симости от значения cmd. Старшие биты в возвраща-

емом значении имеют следующие значения:

бит 15 - таймаут;

бит 14 - передающий сдвиговый регистр пуст:

бит 13 - передающий регистр хранения пуст;

бит 12 - обнаружено прерывание;

бит 11 - ошибка формирования кадра синхронизации;

бит 10 - ошибка четности;

бит 9 - ошибка переполнения;

бит 8 - готовность данных.

Если значение в abyte невозможно передать, то ус-

танавливается бит 15. В других случаях старшие и

младшие биты устанавливаются соответствующим об-

разом. К примеру, если возникла ошибка кадра син-

хронизации, то устанавливается бит 11.

Если cmd имеет значение 2, то считываемый байт

находится в младших битах, если не было ошибки.

Если же произошла ошибка, устанавливается, по

крайней мере, один из старших бит. Если ни один

из старших бит не установлен, значит байт был по-

лучен без ошибки.

Если cmd имеет значение 0 или 3, то возвращаемое

значение содержит старшие биты, как они были опреде-

лены выше, а младшие биты определяются следующим

образом:

бит 7 - прием обнаруженного линейного сигнала;

бит 6 - кольцевой индикатор;

бит 5 - набор данных готов;

бит 4 - готовность к передаче;

бит 3 - изменение в приеме детектора линейного

сигнала;

бит 2 - завершающий кольцевой детектор;

бит 1 - изменение в готовности набора данных;

бит 0 - изменение в готовности к передаче.

Переносимость bioscom поддерживается только на компьютерах

IBM PC или совместимых с ними.

Пример:

-41-

#include <bois.h>

#include <conio.h>

#define COM1 0

#define DATA_READY 0x100

#define SETTINGS (0x80|0x02|0x00|0x00)

int main(void)

{

register int in, out, status;

bioscom(0, SETTINGS, COM1);

cprintf("... BIOSCOM [ESC] to exit ...\n");

while (1)

{

status = bioscom(3, 0, COM1);

if (status & DATA_READY)

if ((out=bioscom(2, 0, COM1) & 0x7F) != 0)

putch(out);

if (kbhit())

{

if ( (in = getch()) == '\x1B')

return(0);

bioscom(1, in, COM1);

}

}

return 0;

}

biosdisk

Функция Дисковые функции BIOS.

Синтаксис #include<bios.h>

int biosdisk(int cmd, int drive, int head,

int track, int sector, int nsects, void * buffer);

Файл, содержащий bios.h

прототип

Описание biosdisk использует прерывание 0x13 для того,чтобы

передать выполнение дисковых операций непосредст-

венно системе BIOS.

drive представляет собой число, которое задает

используемый дисковод: 0 для 1-го устройства гиб-

ких дисков, 1 для 2-го устройства гибких дисков,

3 для 3-го устройства и т.д. Для жестких дисковых

устройств значение drive 0x80 задает первый дис-

ковод, значение 0x81 - второй дисковод, значение

0x82 - третий и т.д.

Для жестких дисков указывается физическое устрой-

ство, а не раздел диска. При необходимости прик-

ладная программа должна будет самостоятельно ин-

терпретировать таблицу разделов.

cmd обозначает выполняемую операцию. В зависимос-

ти от значения cmd остальные аргументы могут тре-

боваться или нет.

-42-

Далее перечислены возможные значения cmd для

компьютеров IBM PC, XT, AT, PS/2 или совместимых

с ними.

0 Аппаратный сброс дискового контроллера. Все

остальные параметры игнорируются.

1 Возвращает статус последней дисковой операции.

Все остальные параметры игнорируются.

2 Считывает в память один или несколько секторов

диска. Начальный сектор, подлежащий считыванию,

задается аргументами head, track и sector. Чис-

ло считываемых секторов задается аргументом

nsects. Данные считываются в buffer по 512 бай-

тов на сектор.

3 Записывает на диск из памяти один или более

дисковых секторов. Начальный сектор задается

аргументами head, track и sector. Число сек-

торов определяется аргументом nsects. Данные

записываются на диск из buffer по 512 байт на

сектор.

4 Производит верификацию одного или более секто-

ров. Начальный сектор определяется аргументами

head, track и sector. Количество секторов зада-

ется в nsects.

5 Форматирует дорожку. Дорожка определяется

аргументами head и track. buffer является ад-

ресным указателем таблицы дескрипторов секто-

ров, которые будут записываться на указанной

дорожке. Обратитесь к документу "Техническое

справочное руководство по IBM PC", в котором

подробно описана данная таблица и операция

форматирования.

Только для компьютеров типа XT, AT, PS/2 и сов-

местимых с ними разрешены следующие значения ар-

гумента cmd:

6 Форматирует дорожку и устанавливает флаги пло-

хих секторов.

7 Форматирует диск, начиная с заданной дорожки.

8 Возвращает параметры текущего дисковода. Дан-

ная информация записывается в buffer в первые

четыре байта.

9 Задает характеристики пары устройств.

10 Производит удлиненное считывание, когда чи-

тается 512 байтов плюс 4 дополнительных байта

на каждый сектор.

11 Выполняет удлиненную запись, когда записывается

512 байтов плюс 4 дополнительных байта на

каждый сектор.

12 Выполняет дисковый поиск.

13 Альтернативный сброс диска.

14 Считывает буфер сектора.

15 Записывает буфер сектора.

16 Проверяет готовность заданного диска.

17 Рекалибрует диск.

18 Производит диагностику контроллера RAM.

19 Производит диагностику дисковода.

20 Производит внутреннюю диагностику контроллера.

Примечание. biosdisk работает ниже файловой сис-

-43-

темы - на произвольных секторах, поэтому может

разрушить содержимое файлов и директорий на жест-

ком диске.

Возвращаемое biosdisk возвращает байт состояния, состоя-

значение щий из следующих битов:

0x00 успешная операция.

0x01 неверная команда.

0x02 адресный маркер не найден.

0x03 попытка записи на диск, защищенный от записи.

0x04 сектор не найден.

0x05 неудачный сброс (для жесткого диска).

0x06 диск изменился после последней операции.

0x07 сбой параметра активности дисковода.

0x08 конфликт при работе DMA.

0x09 попытка обращения к DMA за границей 64К.

0x0A обнаружен дефектный сектор.

0x0B обнаружена дефектная дорожка.

0x0C неподдерживаемая дорожка.

0x10 ошибка CRC/ECC при чтении диска.

0x11 ошибка CRC/ECC при корректировке данных.

0x20 сбой при работе контроллера.

0x40 сбой при операции поиска.

0x80 узел подсоединения не отвечает.

0xAA устройство не готово (только для жесткого

диска).

0xBB произошла нераспознаваемая ошибка (только

для жесткого диска).

0xCC произошел сбой при записи.

0xE0 ошибка статуса.

0xFF сбой операции распознавания.

Заметим, что код 0x11 не является ошибкой, посколь-

ку данные являются корректными. Возвращаемое значе-

ние выдается в любом случае, чтобы дать возможность

прикладной программе выработать решение.

Переносимость Данная функция поддерживается только на компью-

терах IBM PC и совместимых с ними.

Смотрите также absread, abswrite.

Пример:

#include<bios.h>

#include<stdio.h>

int main(void)

{

#define CMD 2 /* команда чтения сектора */

#define DRIVE 0 /* номер дисковода для A: */

#define HEAD 0 /* номер головки */

#define TRACK 1 /* номер дорожки */

#define SECT 1 /* номер секторов */

#define NSECT 1 /* число секторов */

int result;

char buffer[512];

printf("Попытка чтения дисковода A:\n");

result = biosdisk(CMD,DRIVE,HEAD,TRACK,SECT,NSECT,buffer);

if(result==0)

-44-

printf("Успешное чтение диска в дисководе A:");

else

printf("Попытка чтения дисковода A: неудача\n");

return 0;

}

biosequip

Функция Проверяет оборудование.

Синтаксис #include<bios.h>

int biosequip(void);

Файл, содержащий bios.h

прототип

Описание biosequip возвращает целое число, описывающее

оборудование, подсоединенное к системе. Для этой

цели используется прерывание 0x11 BIOS.

Возвращаемое Возвращаемое функцией значение представ-

значение ляет собой набор битовых полей. Для компьютера

IBM PC этот набор следующий:

биты 14-15 Количество установленных параллельных

принтеров

00 = 0 принтеров

01 = 1 принтер

10 = 2 принтера

11 = 3 принтера

бит 13 Подсоединение последовательного принтера.

бит 12 Подсоединение игрового контроллера.

биты 9-11 Количество портов передачи данных.

000 = 0 портов

001 = 1 порт

010 = 2 порта

011 = 3 порта

100 = 4 порта

101 = 5 портов

110 = 6 портов

111 = 7 портов

бит 8 DMA (прямой доступ к памяти)

0=Компьютер имеет DMA.

1=Компьютер не имеет DMA; например, PCJr.

биты 6-7 Количество дисков

00=1 дисковод

01=2 дисковода

10=3 дисковода

11=4 дисковода (только, если бит 0 = 1)

бит 4-5 Исходный видео-режим

00 = не используется

01 = 40х25 BW с цветной платой

10 = 80х25 BW с цветной платой

11 = 80х25 BW с монохромной платой

биты 2-3 Размер RAM в компьютере

00 = 16К

01 = 32К

10 = 48К

11 = 64К

бит 1 сопроцессор с плавающей точкой

бит 0 загрузка с диска

-45-

Переносимость biosequip поддерживается только на компьютерах

IBM PC или совместимых с ними.

Пример:

#include <stdio..h>

#include <bios.h>

#define CO_PROCESSOR_MASK 0x0002

int main(void)

{

int equip_check;

/* получить текущую конфигурацию оборудования */

equip_check = biosequip();

/* имеется ли сопроцессор? */

if(equip_check & CO_PROCESSOR_MASK)

printf("Сопроцессор установлен\n");

else

printf("Сопроцессор не установлен\n");

return 0;

}

bioskey

Функция Интерфейс с клавиатурой при помощи функций BIOS.

Синтаксис #include<bios.h>

int bioskey(int cmd);

Файл, содержащий bios.h

прототип

Описание bioskey посредством прерывания BIOS 0x16 выполняет

различные операции c клавиатурой. Параметр cmd

определяет операцию.

Возвращаемое Значение, возвращаемое функцией bioskey, зависит от

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

том cmd:

--------------------------------------------------

cmd Операция

--------------------------------------------------

0 Если младшие 8 бит не нулевые, bioskey

возвращает код ASCII следующей нажатой кла-

виши, ожидающей в очереди. Если младшие 8

битов равны 0, то старшие 8 битов содержат

расширенные коды клавиатуры, описание кото-

рых вы можете найти в документе "Техническое

справочное руководство по IBM PC".

1 Производится проверка, имело ли место нажа-

тие клавиши. Если при проверке возвращает-

ся значение 0, это означает, что клавиша

не была нажата. В противном случае возвра-

щается значение очередной нажатой клавиши.

Сам же код очередной нажатой клавиши сох-

раняется и будет возвращен при следующем

вызове функции bioskey при значении пара-

-46-

метра cmd, равном нулю.

2 Запрашивает текущий статус клавиш типа

SHIFT. Значение получается при логическом

сложении следующих кодов (операции "ИЛИ")

Бит 7 0x80 INSERT нажат

Бит 6 0x40 CAPS нажат

Бит 5 0x20 NUM LOCK нажат

Бит 4 0x10 SCROLL LOCK нажат

Бит 3 0x08 ALT нажат

Бит 2 0x04 CTRL нажат

Бит 1 0x02 LEFT SHIFT нажат

Бит 0 0x01 RIGHT SHIFT нажат

Переносимость bioskey поддерживается только на компьютерах IBM PC

или совместимых с ними.

Пример:

#include <stdio.h>

#include <bios.h>

#include <ctype.h>

#define RIGHT 0x0001

#define LEFT 0x0002

#define CTRL 0x0004

#define ALT 0x0008

int main(void)

{

int key, modifiers;

/* Функция 1 возвращает 0, пока не будет

нажата клавиша. Ожидание ввода. */;

/* now use function 0 to get return value of

while (bioskey(1) == 0);

/* Теперь используем функцию 0, чтобы получить

значение клавиши */

key = bioskey(0);

/* Используем функцию 2, чтобы определить,

используются ли клавиши типа SHIFT */.

modifiers = bioskey(2);

if (modifiers) {

printf("[");

if (modifiers & RIGHT) printf("RIGHT ");

if (modifiers & LEFT ) printf("LEFT ");

if (modifiers & CTRL ) printf("CTRL ");

if (modifiers & ALT ) printf("ALT ");

printf("] ");

}

/* вывести символ нажатой клавишу */

if (isalnum(key & 0xFF))

printf("'%c'\n",key);

else

printf("%#02x\n",key);

}

Результат

Key Pressed was: [LEFT] 'T'

-47-

biosmemory

Функция Возвращает размер оперативной памяти.

Синтаксис #include<bios.h>

int biosmemory(void);

Файл,содержащий bios.h

прототип

Описание biosmemory при помощи прерывания BIOS 0x12

получает значение, равное размеру оперативной па-

мяти. Это значение не включает видео-память, рас-

ширенную память или дополнительную память.

Возвращаемое biosmemory возвращает размер оперативной памяти

значение в блоках по 1К.

Переносимость biosmemory поддерживается только на компьютерах

IBM PC или совместимых с ними.

Пример:

#include<stdio.h>

#include<bios.h>

int main(void)

{

int memory_size;

memory_size = biosmemory(); /* возвращает до

640К */

printf("Оперативная память: %dK\n",memory_size);

return 0;

}

biosprint

Функция Ввод/вывод на принтер при помощи BIOS.

Синтаксис #include<bios.h>

int biosprint(int cmd, int abyte, int port);

Файл, содержащий bios.h

прототип

Описание biosprint выполняет различные операции с

принтером, определяемым аргументом port, при по-

мощи прерывания BIOS 0x17,

Значение аргумента port = 0 соответствует LPT1;

port = 1 соответствует LPT2 и т.д..

Значение аргумента cmd может быть одним из следу-

ющих: 0 печать символа, содержащегося в abyte 1

инициализация порта принтера 2 считывание статуса

принтера Значение аргумента abyte может быть пре-

делах от 0 до 255.

Возвращаемое Значение, возвращаемое функцией biosprint в любой

значение из описанных выше операций, представляет собой

статус принтера, получаемый посредством операции

-48-

"ИЛИ" со следующими битовыми значениями:

Бит 0 0x01 Таймаут устройства;

Бит 3 0x08 Ошибка ввода/вывода

Бит 4 0x10 Включено;

Бит 5 0x20 Конец бумаги;

Бит 6 0x40 Подтверждение приема;

Бит 7 0x80 Не занято.

Переносимость biosprint поддерживается только на компьютерах

IBM PC или совместимых с ними.

Пример:

#include<stdio.h>

#include<conio.h>

#include<bios.h>

int main(void)

{

#define STATUS 2 /* команда получить статус принтера */

#define PORTNUM 0 /* LPT1 */

int status,abyte = 0;

printf("Пожалуйста, выключите принтер. Для продолжения нажмите

любую клавишу\n");

getch();

status = biosprint(STATUS,abute,PORTNUM);

if(status & 0x01)

printf("Таймаут устройства\n");

if(status & 0x08)

printf("Ошибка ввода/вывода\n");

if(status & 0x10)

printf("Включено\n");

if(status & 0x20)

printf("Конец бумаги\n");

if(status & 0x40)

printf("Подтверждение приема\n");

if(status & 0x80)

printf("Не занято\n");

return 0;

}

biostime

Функция Считывание или установка таймера BIOS.

Синтаксис #include <bios.h>

long biostime(int cmd, long newtime);

Файл, содержащий bios.h

прототип

Описание biostime либо считывает, либо устанавливает

таймер BIOS. Этот таймер считывает время, прошед-

шее с полуночи, в тиках (приблизительно в 18.2

тика в секунду). biostime использует прерывание

BIOS 0x1A.

Если аргумент cmd = 0, biostime возвращает теку-

щее значение таймера. При cmd = 1 значение тайме-

-49-

ра устанавливается в аргументе newtime с типом

long.

Возвращаемое Когда функция biostime работает в режиме чтения

значение таймера BIOS (cmd = 0), то возвращаемое значение

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

Переносимость biostime поддерживается только на компьютерах

IBM PC или совместимых с ними.

Пример:

#include<bios.h>

#include<time.h>

#include<conio.h>

int main(void)

{

long bios_time;

clrscr();

cprintf("Число тиков, с полуночи:\r\n");

cprintf("Число секунд, с полуночи:\r\n");

cprintf("Число минут, с полуночи:\r\n");

cprintf("Число часов, с полуночи:\r\n");

cprintf("\r\nДля выхода нажмите любую клавишу");

while(!kbhit())

{

bios_time = biostime(0L);

gotoxy(50,1);

cprintf("%lu",bios_time);

gotoxy(50,2);

cprintf("%lu",bios_time/CLK_TCK);

gotoxy(50,3);

cprintf("%lu",bios_time/CLK_TCK/60);

gotoxy(50,4);

cprintf("%lu",bios_time/CLK_TCK/3600);

}

return(0);

}

brk

Функция Изменяет размещение в памяти сегмента данных.

Синтаксис #include<alloc.h>

int brk(void * addr);

Файл, содержащий alloc.h

прототип

Описание Функция brk используется для динамического измене-

ния количества памяти, распределенного для сег-

мента данных вызываемой программы. Данное измене-

ние производится посредством сброса программного

"значения прерывания", которое является первым

адресом после конца сегмента данных. Таким обра-

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

но, если будет увеличено "значение прерывания".

brk устанавливает "значение прерывания" соответст-

венно параметру addr и аналогично меняет количество

-50-

памяти.

Если для удовлетворения запроса будет недостаточ-

но памяти, функция завершится с ошибкой без изме-

нения распределения памяти.

Возвращаемое При успешном завершении функция brk возвращает зна-

значение чение, равное 0.

При ошибке возвращается значение -1 и глобальной

переменной errno присваивается значение:

ENOMEM - Не хватает памяти.

Переносимость brk поддерживается на системах UNIX.

Смотрите также coreleft, sbrk.

Пример:

#include<stdio.h>

#include<alloc.h>

int main(void)

{

char *ptr;

printf("Изменение объема выделенной памяти с помощью brk");

ptr = malloc(1);

printf("Перед вызовом brk() свободно %lu байт\n",coreleft());

brk(ptr+1000);

printf("После вызова brk() свободно %lu байт\n",coreleft());

return 0;

}

bsearch

Функция Двоичный поиск в массиве.

Синтаксис #include <stdlib.h>

void * bsearch(const void * key, const void * base,

size_t nelem, size_t width,

int (*fcmp) (const void *, const void *));

Файл, содержащий stdlib.h

прототип

Описание bsearch осуществляет поиск по таблице (массиву) из

элементов nelem и возвращает адрес первого элемента

в таблице, который соответствует шаблону поиска.

Если соответствие не найдено, то bsearch возвращает

значение, равное 0.

Тип size_t определяется как unsigned int.

- nelem задает количество элементов таблицы;

- width задает количество байтов в каждом элементе

таблицы.

Функция сравнения fcmp вызывается с двумя аргу-

ментами: elem1 и elem2. Каждый аргумент указывает

на сравниваемый элемент. Функция сравнения срав-

нивает элементы, адресуемые указателями (*elem1 и

*elem2) и возвращает целое значение, зависящее от

-51-

результатов сравнения.

Для bsearch *fcmp возвращает следующее значение:

< 0 *elem1 < *elem2

==0 *elem1 == *elem2

> 0 *elem1 > *elem2

Возвращаемое bsearch возвращает адрес первого элемента таблицы,

значение соответствующего ключу поиска. Если такого соот-

ветствия не найдено, то возвращается значение,

равное 0.

Переносимость Поддерживается в системах UNIX и определена в

ANSI C.

Смотрите также lfind, lsearch, qsort.

Пример:

#include <stdlib.h>

#include <stdio.h>

#define NELEMS(arr) (sizeof(arr) / sizeoff(arr[0]))

int numarray[] = {123, 145, 512, 627, 800, 993};

int numeric(int *pl, int *p2)

{

return(*p1 - *p2);

}

int lookup(int key)

{

int *itemptr;

/* явное преобразование

необходимо для исключения ошибки несовпадения типов, воз-

никающей во время компиляции */

itemptr = bsearch(&key, numarray, NELEMS(numarray),

sizeof(int), (int (*)(const void *,const void *))numeric);

return (itemptr != NULL);

}

int main(void)

{

if(lookup(512))

printf("В таблице есть элемент 512\n");

else

printf("В таблице нет элемента 512\n");

return 0;

}

cabs

Функция Абсолютное значение комплексного числа.

Синтаксис #include <math.h>

double cabs(struct complex z);

Файл, содержащий math.h

прототип

Описание cabs - это макрокоманда, которая вычисляет абсо-

лютное значение комплексного числа z. z является

структурой типа complex; структура определена в

math.h следующим образом:

-52-

struct complex {

double x,y;

};

где x есть действительная часть, а y - мнимая

часть.

Вызов cabs эквивалентен вызову sqrt с действи-

тельной и мнимой частью z, как показано ниже:

sqrt(z.x * z.x + z.y + z.y)

При использовании С++, можно воспользоваться ти-

пом complex, определенном в файле complex.h, и

функцией abs.

Возвращаемое cabs возвращает абсолютное значение z типа double.

значение При переполнении cabs возвращает HUGE_VAL и уста-

навливет errno в

ERANGE - Результат превышает допустимые пределы.

Управление ошибками для cabs можно изменить с по-

мощью функции matherr.

Переносимость cabs поддерживается на системах UNIX.

Смотрите также abs, complex, fabs, labs, matherr.

Пример:

#include<stdio.h>

#include<math.h>

int main()

{

struct complex z;

double val;

z.x=2.0;

z.y=1.0;

val = cabs(z);

printf("Абсолютное значение от (%.2lfi %.2lfj) = %.2lf",z.x,

z.y,val);

return 0;

}

calloc

Функция Выделяет оперативную память.

Синтаксис #include <stdlib.h>

void * calloc(size_t nitems, size_t size);

Файл, содержащий stdlib.h,alloc.h

прототип

Описание calloc обеспечваеит доступ к памяти heap.

heap доступен для динамического распределения

блоков памяти переменной длины. Многие структуры

данных, например, деревья и списки, используют

распределение памяти heap.

-53-

Все пространство памяти между концом сегмента

данных и верхушкой программного стека доступно

для использования в моделях памяти small (tiny,

small, medium), кроме небольшой области в самой

верхней части стека. Это пространство необходимо

для роста стека прикладной программы и плюс не-

большая часть, используемая DOS.

В моделях памяти типа large (compact, large,

huge) все пространство за границей программного

стека до конца физической памяти доступно для

heap.

calloc выделяет блок памяти размером nitems x

size. Блок обнуляется. Если размер блока превыша-

ет 64К то нужно использовать функцию farcalloc.

Возвращаемое calloc возвращает указатель на выделенный блок.

значение calloc возвращает NULL, если недостаочно памяти

для выделения нового блока, или nitems или size

равны 0.

Переносимость Поддерживается в системах UNIX и определена в ANSI

C. Описана в Керниган и Риччи.

Смотрите также faralloc, free, malloc, realloc.

Пример:

#include<stdio.h>

#include<alloc.h>

#include<string.h>

int main(void)

{

char *str = NULL;

/* выделить память для строки */

str = calloc(10,sizeof(char));

if(str)

{

/* скопировать в строку "Hello" */

strcopy(str,"Hello");

/* вывести строку */

printf("Строка : %s\n",str);

/* освободить память */

free(str);

}

else

{

printf("Недостаточно памяти\n");

}

return(0);

}

ceil

Функция Округление.

Синтаксис #include <math.h>

double ceil(double x);

-54-

Файл, содержащий math.h

прототип

Описание ceil находит наименьшее целое число, не меньшее x.

Возвращаемое ceil возвращает найденное число (тип double).

значение

Переносимость Поддерживается в системах UNIX и определена в ANSI

C.

Смотрите также floor, fmod.

Пример:

#include<math.h>

#include<stdio.h>

int main(void)

{

double number = 123.54;

double down,up;

down = floor(number);

up = ceil(number);

printf("Исходное число:%5.21f\n",number);

printf("Округленное вниз :%5.21f\n",down);

printf("Округленное вверх :%5.21f\n",up);

return 0;

}

cgets

Фукция Cчитывает строку с консоли.

Синтаксис #include<conio.h>

char *cgets(char *str);

Файл, содержащий conio.h

прототип

Описание cgets считывает символьную строку с консоли и

сохраняет ее (и длину строки) в буфере, указывае-

мом параметром str.

cgets считывает символы до тех пор, пока не вст-

ретится комбинация CR/LF (возврат каретки/перевод

строки), или пока не будет считано указанное чис-

ло символов. Если cgets считала комбинацию CR/LF,

она заменяет их на \0 (нулевой ограницитель стро-

ки).

До вызова cgets аргумент str[0] должен быть уста-

новлен на максимальную длину считываемой строки.

При возврате str[1] содержит количество считанных

символов. Символы хранятся, начиная с str[2], и

заканчиваются нулевым символом. Итак, аргумент

str должен иметь размер, по крайней мере, str[0]

плюс 2 байта.

Возвращаемое При успешном завершении cgets возвращает указатель

значение на str[2].

-55-

Переносимость Эта функция поддерживается только на компьютерах

IBM PC или совместимых с ними.

Смотрите также cputs, fgets, getch, getche, gets.

Пример:

#include <stdio.h>

#include <conio.h>

main()

{

char buffer[83];

char *p;

/* место под 81 символ */

buffer[0] = 81;

p = cgets(buffer);

printf("\ncgets считала %d символов: \"%s\"\n",buffer[1], p);

printf("Возвращается указатель %p, buffer[2] на %p\n",p,&buffer);

/* место под 5 символов и завершающий 0 */

buffer[0] = 6;

printf("Введите несколько символов\n");

p = cgets(buffer);

printf("\ncgets считала %d символов: \"%s\"\n,buffer[1], p);

printf("Возвращается указатель %p, buffer[2] на %p\n",p,&buffer);

return 0;

}

chdir

Функция Изменяет текущую директорию.

Синтаксис #include<dir.h>

int chdir(const char * path);

Файл, содержащий dir.h

прототип

Описание Функция chdir делает директорию, определяемую ар-

гументом path, текущей рабочей директорией. Аргу-

мент path должен определять существующую директо-

рию.

Спецификация устройства также может задаваться в

аргументе path, например,

chdir("a:\\tc")

но изменяется только текущая директория на этом

устройстве; само активное устройство не изменяет-

ся.

Возвращаемое При успешном завершении функция chdir выдает зна-

значение чение 0. Иначе, функция возвращает значение -1, а

errno присваивается следующее значение:

ENOENT - Маршрут или имя файла не найдены.

Переносимость Функция chdir поддерживается на системах UNIX.

-56-

Смотрите также getcurdir, getcwd, getdisk, mkdir, rmdir, setdisk,

system.

Пример:

#include<stdio.h>

#include<stdlib.h>

#include<dir.h>

char old_dir[MAX_DIR];

char new_dir[MAX_DIR];

int main(void)

{

if(getcurdir(0,old_dir))

{

perror("getcurdir()");

exit(1);

}

printf("Текущая директория: \\%s\n",old_dir);

if(chdir("\\");

{

perror("chdir()");

exit(1);

}

if(getcurdir(0,new_dir))

{

perror("getcurdir()");

exit(1);

}

printf("Теперть текущая директория: \\%s\n",new_dir);

if(chdir(old_dir);

{

perror("chdir()");

exit(1);

}

return 0;

}

_chmod

Функция Изменяет режим доступа к файлу.

Синтаксис #include <dos.h>

#include <io.h>

int _chmod(const char * path, int func[,int attrib]);

Файл, содержащий io.h

прототип

Описание Функция _chmod может изменять или устанавливать

атрибуты файлов DOS. Если func равен 0, то функ-

ция возвращает текущие атрибуты DOS для данного

файла. Если func равен 1, то атрибуты устанавли-

ваются в сооответствии с аргументом attrib.

attrib может быть одной из следующих символьных

константных значений (определенных в dos.h):

FA_RDONLY только чтение

FA_HIDDEN скрытый файл

FA_SYSTEM системный файл

-57-

FA_LABEL метка тома

FA_DIREC директория

FA_ARCH архив

Возвращаемое При успешном завершении _chmod возвращает слово с

значение атрибутами файла; иначе, возвращается значение -1.

В случае ошибки errno присваивается одно из сле-

дующих значений:

ENOENT - Маршрут или имя файла не найдены

EACCES - Отказ доступа

Переносимость _chmod уникальна для DOS.

Смотрите также chmod, _creat.

Пример:

#include<errno.h>

#include<stdio.h>

#include<dos.h>

#include<io.h>

int get_file_attrib(char *filename);

int main(void);

{

char filename[128];

int attrib;

printf("Введите имя файла:");

scanf("%s",filename);

attrib = get_file_attrib(filename);

if(attrib == -1)

switch(errno)

{

case ENOENT:printf("Маршрут или имя файла не найдены\n");

break;

case EACCES:printf("Отказ доступа\n");

break;

default: printf("Ошибка номер %d\n",errno);

break;

}

else

{

if(attrib & FA_RDONLY)

printf("%s имеет атрибут только на чтение\n",filename);

if(attrib & FA_HIDDEN)

printf("%s - cкрытый файл\n",filename);

if(attrib & FA_SYSTEM)

printf("%s - системный файл \n",filename);

if(attrib & FA_LABEL)

printf("%s - метка тома\n",filename);

if(attrib & FA_DIREC)

printf("%s - директория\n",filename);

if(attrib & FA_ARCH)

printf("%s - архивный файл\n",filename);

}

return 0;

}

/* возвращает атрибуты файла */

-58-

int get_file_attrib(char *filename)

{

return(_chmod(filename,0));

}

chmod

Функция Изменяет режим доступа к файлу.

Синтаксис #include <sys\stat.h>

int chmod(const char * path, int amode);

Файл, содержащий io.h

прототип

Описание Функция chmod уставливает режим доступа к файлу,

заданному аргументом path в соответствии с мас-

кой, содержащейся в аргументе amode. Аргумент

path представляет собой адресный указатель сим-

вольной строки; *path является первым сиволом

этой строки.

amode может содержать одну или обе символьные

константы S_IWRITE и S_IREAD (определенные в фай-

ле sys\stat.h).

---------------------------------------------------

Значение, amode Режим доступа

---------------------------------------------------

S_IWRITE Разрешение на запись

S_IREAD Разрешение на чтение

S_IREAD|S_IWRITE Разрешение на чтение и запись

---------------------------------------------------

Возвращаемое При успешном завершении изменения режима доступа к

значение файлу функция chmod возвращает значение 0. Иначе,

chmod возврашает значение -1.

В случае ошибки errno присваивается одно из сле-

дующих значений:

ENOENT - Маршрут или имя файла не найдены;

EACCES Отказ доступа.

Переносимость Функция chmod поддерживается на системах UNIX.

Смотрите также access, _chmod, fstat, open, sopen, stat.

Пример:

#include <stdio.h>

#include <sys\stat.h>

#include <io.h>

void make_read_only(char *filename);

int main(void)

{

make_read_only("NOTEXIST.FIL");

make_read_only("MYFILE.FIL");

return0 0;

}

-59-

void make_read_only(char *filename)

{

int stat;

stat = chmod(filename, S_IREAD);

if (stat)

printf("Не могу сделать %s только для чтения\n",

filename);

else

print(" %s теперь имеет атрибут только для чтения\n", filename);

}

Результат

chsize

Функция Изменяет размер файла.

Синтаксис #include<io.h>

int chsize(int handle, long size);

Файл, содержащий io.h

прототип

Описание chsize изменяет размер файла, связанного с

дескриптором handle. Она может уменьшить или уве-

личить файл относительно его начального размера в

зависимости от значения аргумента size.

Режим, в котором открывается файл, должен иметь

разрешение на запись.

Если chsize увеличивает файл, то к нему присоеди-

няются нулевые символы (\0). Если файл уменьшается,

то данные за новым признаком конца файла теряют-

ся.

Возвращаемое При успешном завершении chsize возвращает 0. При

значение ошибке возвращается -1, а переменной errno

присваивается одно из следующих значений:

EACCES - Отказ доступа;

EBADF - Неверный номер файла;

ENOSPC - UNIX - не для DOS.

Переносимость chsize уникальна для DOS.

Смотрите также close, _creat, creat, open.

Пример:

#include<string.h>

#include<fcntl.h>

#include<io.h>

int main(void)

{

int handle;

char buf[11] = "0123456789";

/* создать текстовый файл из 10 байт */

handle = open("DUMMY.FIL",O_CREAT);

write(handle,buf,strlen(buf));

/* обрезать файл до 5 байт */

chsize(handle,5);

-60-

/* закрыть файл */

close(handle);

return 0;

}

circle

Функция Рисует окружность заданного радиуса с центром в

точке с координатами (x,y).

Синтаксис #include <graphics.h>

void far circle(int x,int y,int radius);

Файл, содержащий graphics.h

прототип

Описание circle рисует окружность текущим цветом с цент-

ром в точке (x,y) и радиусом radius.

Замечание. Параметр linestyle не оказывает воз-

действие при построении дуг, окружностей, элипсов

и секторов. Используется только параметр

thickness.

Если на экране окружности не выглядят круглыми,

измените корректирующий фактор характеристическо-

го отношения.

Возврощаемое Нет.

значение

Переносимость Функция уникальна для Turbo C++. Она работает

только на компьютерах IBM PC и совместимых с ними,

оснащенных дисплейными адаптерами, поддерживающими

графический режим.

Смотрите также arc, ellipse, fillelipse, getaspectratio, sector,

setaspectratio.

Пример:

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

int main(void)

{

/* Запрос автоопределения */

int graphdriver = DETECT, gmode, errorcode;

int midx,midy;

int radius = 100;

/* инициализация графики и локальных переменных */

initgraph(&graphdriver,&gmode,"");

/* получение результата инициализации */

errorcode = graphresult();

if(errorcode != grOk) /* если ошибка */

{

-61-

printf("Ошибка :%s\n",grapherrormessage(errorcode));

printf("Для останова нажмите любую клавишу\n");

getch();

exit(1); /* завершение с кодом ошибки */

}

midx = getmaxx() / 2;

midy = getmaxy() / 2;

setcolor(getmaxcolor(1));

/* рисует окружность */

circle(midx,midy,radius);

/* очистить */

getch();

closegraph();

return 0;

}

_clear87

Функция Очищает слово состояния операций с плавающей точ-

кой.

Синтаксис #include<float.h>

insigned int _clear87(void);

Файл, содержащий float.h

прототип

Описание Функция _clear87 очищает слово состояния операций

с плавающей точкой, которое является комбинацией

слова состояния сопроцессора 8087/80287 и других

условий, обнаруженных программой обработки исклю-

чительных ситуаций сопроцессора 8087/80287.

Возвращаемое Биты, из которых состоит возвращаемое

значение значение функции, содержат старое слово состоя-

ния операций с плавающей точкой до его очистки.

Смотрите описание констант в float.h, где вы най-

дете полное определение битов слова состояния.

Смотрите также _control87, _fpreset, _status87.

Пример:

#include<stdio.h>

#include<float.h>

int main(void)

{

float x;

double y=1.5e-100;

printf("Состояние 8087 перед ошибкой: %X\n",_status87());

x = y; /* создание состояния переполнения и потери точности */

printf("Состояние 8087 после ошибки: %X\n",_status87());

_clear87();

printf("Состояние 8087 после обнуления: %X\n",_status87());

return 0;

}

-62-

cleardevice

Функция Очищает графический экран.

Синтаксис #include <graphics.h>

void far cleardevice(void);

Файл, содержащий graphics.h

прототип

Описание cleardevice стирает (это значит - зарисовыва-

ет текущим цветом фона) весь графический экран и

переносит CP (текущую позицию) в начало экрана

(0,0).

Возвращаемое Нет.

значение

Переносимость Функция уникальна для Turbo C++. Она работает

только на компьютерах IBM PC и совместимых с ни-

ми, оснащенных дисплейными адаптерами, поддержи-

вающими графический режим.

Смотрите также clearviewport.

Пример:

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

int main(void)

{

/* Запрос автоопределения */

int graphdriver = DETECT, gmode, errorcode;

int midx,midy;

/* инициализация графики и локальных переменных */

initgraph(&graphdriver,&gmode,"");

/* получение результата инициализации */

errorcode = graphresult();

if(errorcode != grOk) /* если ошибка */

{

printf("Ошибка :%s\n",grapherrormessage(errorcode));

printf("Для останова нажмите любую клавишу\n");

getch();

exit(1); /* завершение с кодом ошибки */

}

midx = getmaxx() / 2;

midy = getmaxy() / 2;

setcolor(getmaxcolor(1));

/* установка выравнивания текста */

settextjustify(CENTER_TEXT,CENTER_TEXT);

/* вывод на экран сообщения */

outtextxy(midx,midy,"Для очистки экрана нажмите любую клавишу);

/* ожидание нажатия клавиши */

getch();

/* очистка экрана */

-63-

cleardevice();

/* вывести другое сообщение */

outtextxy(midx,midy,"Для завершения нажмите любую клавишу");

/* очистка */

getch();

closegraph();

return 0;

}

clearerr

Функция Сброс индикации ошибок.

Синтаксис #include<stdio.h>

void clearerr(FILE * stream);

Файл, содержащий stdio.h

прототип

Описание clearerr сбрасывает в 0 ошибку и признак конца

файла указанного потока. После того, как был ус-

тановлен признак ошибки, потоковые операции возв-

ращают состояние ошибки до тех пор, пока не будет

сделано обращение к clearerr или rewind.

Признак конца файла сбрасывается при каждой опе-

рации ввода.

Возвращаемое Нет.

значение

Переносимость clearerr поддерживается на системах UNIX и опреде-

лена в ANSI C.

Смотрите также eof, feof, ferror, perror, rewind.

Пример:

#include<stdio.h>

int main(void)

{

FILE *fp;

char ch;

/* открыть файл для записи */

fp = open("DUMMY.FIL","w");

/* вызвать ошибочное состояние */

ch = getc(fp);

if(ferror(fp)

{

/* вывести сообщение об ошибке */

printf("Ошибка чтения из DUMMY.FIL\n");

/* Сбросить признаки конца файла и ошибки */

clearerr(fp);

}

fclose(fp);

return 0;

}

clearviewport

Функция Очищает текущую область просмотра.

-64-

Синтаксис #include <graphics.h>

void far clearviewport(void);

Файл, содержащий graphics.h

прототип

Описание clearviewport очищает текущую область просмотра

экрана и переносит CP ( текущую позицию ) в

(0,0), относительно области просмотра.

Возвращаемое Нет.

значение

Переносимость Функция уникальна для Turbo C++. Она работает

только на компьютерах IBM PC и совместимых с ни-

ми, оснащенных дисплейными адаптерами, поддержи-

вающими графический режим.

Смотрите также cleardevice, getviewsettings, setviewport.

Пример:

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#define CLIP_ON 1 /* активизации клиппирования в области просмотра */

int main(void)

{

/* Запрос автоопределения */

int graphdriver = DETECT, gmode, errorcode;

int ht;

/* инициализация графики и локальных переменных */

initgraph(&graphdriver,&gmode,"");

/* получение результата инициализации */

errorcode = graphresult();

if(errorcode != grOk) /* если ошибка */

{

printf("Ошибка :%s\n",grapherrormessage(errorcode));

printf("Для останова нажмите любую клавишу\n");

getch();

exit(1); /* завершение с кодом ошибки */

}

setcolor(getmaxcolor(1));

ht = textheight("W");

/* сообщение выводится в область просмотра, по умолчанию это весь

экран */

outtextxy(0,0,"<-- 0,0 область просмотра по умолчанию");

/* создать меньшую область просмотра */

setviewport(50,50,getmaxx()-50,getmaxy()-50,CLIP_ON);

/* вывести сообщение */

outtextxy(0,0,"<-- 0,0 меньшая область просмотра");

outtextxy(0,2*ht,"Для очистки области просмотра нажмите клавишу");

/* ожидание нажатия клавиши */

getch();

/* очистка области просмотра */

-65-

clearviewport();

/* вывести другое сообщение */

outtextxy(midx,midy,"Для завершения нажмите любую клавишу):

/* очистка */

getch();

closegraph();

return 0;

}

clock

Функция Определяет время процессора.

Синтаксис #include <time.h>

clock_t clock(void);

Файл, содержащий time.h

прототип

Описание clock может быть использована для определения

интервала времени между двумя событиями.

Для определения времени в секундах, значение,

возвращаемое функцией clock, должно быть поделено

на значение макро CLK_TCK.

Возвращаемое Функция clock возвращает время процессора

значение с момента начала выполнения программы. Если время

процессора недоступно или его значение не может

быть интерпретировано, то функция возвращает зна-

чение -1.

Переносимость clock совместима с ANSI C.

Смотрите также time.

Пример:

#include <time.h>

#include <stdio.h>

int main(void)

{

clock_t start, end;

start = clock();

/* Тестируемые операторы */

delay(2000);

end = clock();

printf("The time was: %f\n",

(end - start) / CLK_TCK);

return 0;

}

_close

Функция Закрывает файл.

Синтаксис #include<io.h>

int _close(int handle);

-66-

Файл, содержащий io.h

прототип

Описание _close закрывает файл, связанный с дескриптором

handle. Аргумент handle обозначает дескриптор

файла, присваиваемый ему при вызове функций

_creat, creat, creatnew, creattemp, dup, dup2,

_open или open.

Примечание. Эта функция не записывает символ

Ctrl-Z в конец файла. Если вы хотите завершить

файл этим символом, его следует явно вывести.

Возвращаемое При успешном завершении _close

значение возвращает значение 0. Иначе возвращается значе-

ние -1.

Если аргумент handle не является дескриптором от-

крытого файла, это приводит к неудачному заверше-

нию операции. errno получает следующее значение:

EBADF - Неверный номер файла.

Переносимость _close уникальна для DOS.

Смотрите также close, _creat, open, read, write.

Пример:

#include<string.h>

#include<fcntl.h>

#include<io.h>

int main(void)

{

int handle;

char buf[11] = "0123456789";

/* создать файл содержащий 10 байт */

handle = open("DUMMY.FIL",O_CREAT);

write(handle,buf,strlen(buf));

/* закрыть файл */

_close(handle);

return 0;

}

close

Функция Закрывает файл.

Синтаксис #include<io.h>

int close(int handle);

Файл, содержащий io.h

прототип

Описание close закрывает файл, связанный с дескриптором

handle. Аргумент handle обозначает дескриптор

файла, присваиваемый ему при вызове функций

_creat, creat, creatnew, creattemp, dup, dup2,

_open или open.

Примечание. Эта функция не записывает символ

-67-

Ctrl-Z в конец файла. Если вы хотите завершить

файл этим символом, его следует явно вывести.

Возвращаемое При успешном завершении close

значение возвращают значение 0. Иначе возвращается значе-

ние -1.

Если аргумент handle не является дескриптором от-

крытого файла, это приводит к неудачному заверше-

нию операции. errno получает следующее значение:

EBADF - Неверный номер файла.

Переносимость close поддерживается в системах UNIX.

Смотрите также chsize, _close, creat, creatnew, dup, fclose, open,

sopen.

Пример:

#include<string.h>

#include<fcntl.h>

#include<io.h>

int main(void)

{

int handle;

char buf[11] = "0123456789";

/* создать файл содержащий 10 байт */

handle = open("NEW.FIL",O_CREAT);

if(handle > -1)

{

write(handle,buf,strlen(buf));

/* закрыть файл */

close(handle);

}

else

{

printf("Ошибка, при открытии файла\n");

}

return 0;

}

closegraph

Функция Прекращает работу графической системы.

Синтаксис #include <graphics.h>

void far closegraph(void)

Файл, содержащий graphics.h

прототип

Описание closegraph освобождает всю память,выделен-

ную под графическую систему, затем восстанавлива-

ет экран в режим, который был до вызова

initgraph. (Графическая система освобождает па-

мять, а также драйверы, шрифты и внешние буферы

посредством вызова _graphfreemem).

Возвращаемое Нет.

значение

-68-

Переносимость Функция уникальна для Turbo C++. Она работает

только на компьютерах IBM PC и совместимых с ни-

ми, оснащенных дисплейными адаптерами, поддержи-

вающими графический режим.

Смотрите также initgraph, setgraphbufsize.

Пример:

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

int main(void)

{

/* Запрос автоопределения */

int graphdriver = DETECT, gmode, errorcode;

int x,y;

/* инициализация графики и локальных переменных */

initgraph(&graphdriver,&gmode,"");

/* получение результата инициализации */

errorcode = graphresult();

if(errorcode != grOk) /* если ошибка */

{

printf("Ошибка :%s\n",grapherrormessage(errorcode));

printf("Для останова нажмите любую клавишу\n");

getch();

exit(1); /* завершение с кодом ошибки */

}

x = getmaxx()/2;

y = getmaxy()/2;

/* вывод сообщения */

settextjustify(CENTER_TEXT,CENTER_TEXT);

outtextxy(x,y,"Для завершения работы графической системы нажмите

любую клавишу");

/* ожидание нажатия клавиши */

getch();

/* закрытие графической системы */

closegraph();

printf("Мы опять в текстовом режиме\n");

printf("Для завершения нажмите любую клавишу\n");

getch();

return 0;

}

clreol

Функция Удаляет до конца строки в текстовом окне.

Синтаксис #include<conio.h>

void clreol(void);

Файл, содержащий conio.h

прототип

-69-

Описание clreol удаляет все символы от позиции курсора до

конца строки в текущем текстовом окне без переме-

щения курсора.

Возвращаемое Нет.

значение

Переносимость clreol поддерживается только на компьютерах IBM PC

или совместимых с ними.

Смотрите также clrscr, delline, window.

Пример:

#include<conio.h>

int main(void)

{

clrscr();

cprintf("Функция CLREOL обнуляет все символы, начиная\r\n");

cprintf("от позиции курсора, до конца строки, внутри \r\n");

cprintf("текущего текстового окна, без перемещения курсора.\r\n");

cprintf("Для продолжения нажмите любую клавишу...");

gotoxy(14,4);

getch();

clreol();

getch();

return 0;

}

clrscr

Функция Очищает окно в текстовом режиме.

Синтаксис #include<conio.h>

void clrscr(void);

Файл, содержащий conio.h

прототип

Описание clrscr очищает текущее текстовое окно и перемеща-

ет курсор в верхний левый угол экрана (в позицию

1,1).

Возвращаемое Нет.

значение

Переносимость clrscr поддерживается только на компьютерах IBM PC

или совместимых с ними.

Смотрите также clreol, delline, window.

Пример:

#include<conio.h>

int main(void)

{

int i;

clrscr();

for(i=0;i<20;i++)

cprintf("%d\r\n",i);

cprintf("\r\nДля очистки экрана нажмите любую клавишу");

-70-

getch();

clrscr();

cprintf("Экран очищен!");

getch();

return 0;

}

complex

Функция Создает комплексные числа.

Синтаксис #include<complex.h>

complex complex(double real,double imag);

Файл, содержащий complex.h

прототип

Описание Создает комплексное число из данных вещественной и

мнимой части. Если параметр imag опускается, то

мнимая часть считается равной 0. complex - это

конструктор класса С++ complex, который определен

в complex.h. Другие функции, которые также позво-

ляют работать с complex, приведены в разделе

"Смотри также". Некоторые из этих стандартных

функций переопределяются в math.h. Для работы с

комплексными версиями этих функций требуется С++.

Если вы не желаете работать с С++, а предпочитае-

те с С, то вам доступны только конструкции типа

struct complex и cabs, возвращающие абсолютное

значение комплексного числа. Они определены в

math.h. В complex.h, кроме этого переопределяются

операции +, -, *, /, +=, -=, *=, /=, =, == и !=.

Это позволяет использовать с комплексными числами

обычные операции. В выражениях вы можете исполь-

зовать вместе с комплексными числами, целые, ве-

щественные и другие числовые типы. Опереторы по-

токового ввода/вывода << и >> переопределены для

комплексных чисел, так же как и для остальных чи-

сел.

Возвращаемое Комплексное число с данными вещественной и мнимой

значение частями.

Переносимость Комплексные функции требуют С++ и поэтому непере-

носимы. Поскольку мы следуем С++ AT&T версии 2.0,

то вы можете попробовать комплексные функции на

других компиляторах, придерживающихся этого же

стандарта.

Смотрите также abs, acos, arg, asin, atan, atan2, conj, cos, cosh,

imag, log, log10, norm, polar, pow, real, sin,

sinh, sqrt, tan, tanh.

Пример:

#include<iostream.h>

#include<complex.h>

int main(void)

{

double x = 3.1, y=4.2;

complex z = complex(x,y);

-71-

cout << "z= " << z << "\n";

cout << "имеет вещественную часть =" << real(z) << "\n";

cout << "имеет мнимую часть =" << imag(z) << "\n";

cout << "z имеет сопряженное значение = " << conj(z) << "\n"

return 0;

}

conj

Функция Возвращает комплексное сопряжение комплексного

числа.

Синтаксис #include<complex.h>

complex conj(complex x);

Файл, содержащий complex.h

прототип

Описание conj(z) аналогично complex(real(z), -imag(z)).

Возвращаемое Возвращает комплексно-сопряженное к данному число.

значение

Смотри также complex, imag, real.

Пример:

#include<iostream.h>

#include<complex.h>

int main(void)

{

double x = 3.1, y=4.2;

complex z = complex(x,y);

cout << "z= " << z << "\n";

cout << "имеет вещественную часть =" << real(z) << "\n";

cout << "имеет мнимую часть =" << imag(z) << "\n";

cout << "z имеет сопряженное значение = " << conj(z) << "\n"

return 0;

}

_control87

Функция Манипулирует словом управления операций с плавающей

точкой.

Синтаксис #include<float.h>

unsigned int _control87(unsigned int newcw,

unsigned int mask);

Файл, содержащий float.h

прототип

Описание _control87 извлекает и изменяет слово управления

операциями с плавающей точкой.

Слово управления плавающей точки имеет тип

unsigned int, в котором бит за битом перечислены

режимы операций с плавающей точкой, а именно: ре-

жимы точности, бесконечности и округления. Изме-

нение этих режимов позволяет маскировать исключи-

тельные состояния операций с плавающей точкой.

-72-

_control87 сравнивает биты в mask с битами в

newcw. Если бит в mask равен 1, то соответствую-

щий бит в new содержит новое значение для такого

же бита в слове управления операций с плавающей

точкой, а _control87 устанавливает этот бит в

слове управления в новое значение.

Пример:

Исходное слово управления: 0100 0011 0110 0011

mask 1000 0001 0100 1111

newcw 1110 1001 0000 0101

Изменяющиеся биты 1xxx xxx1 x0xx 0101

Если mask равен 0, то _control87 возвращает слово

управления операциями с плавающей точкой без из-

менения.

_control87 не изменяет бит Denormal, поскольку

Turbo C++ использует ненормальную обработку иск-

лючительных ситуаций.

Возвращаемое Биты в возвращаемом значении представляют собой

значение новое слово управления операциями с плавающей точ-

кой. Полное описание битов, возвращаемых функцией

_control87, приведено в в файле заголовка

float.h.

Переносимость _control87 уникальна для DOS.

Смотрите также _clear87, _fpreset, signal, _status87.

Пример: /* маскирование исключительных ситуаций вычисле-

ний с плавающей точкой */

_control87(MCW_EM,MCW_EM);

coreleft

Функция Возвращает размер неиспользуемой оперативной памяти.

Синтаксис В моделях данных tiny, small, medium:

#include <alloc.h>

unsigned coreleft(void);

В моделях данных compact, large, huge:

#include <alloc.h>

unsigned long coreleft(void);

Файл, содержащий alloc.h

прототип

Описание coreleft возвращает размер неиспользуемой

оперативной памяти. Выводятся различные значения

в зависимости от модели памяти.

Возвращаемое В малых моделях памяти coreleft возвращает

значение количество неиспользуемой памяти между вершиной

heap и стеком. В больших моделях памяти, она воз-

вращает объем памяти между самым верхним выделен-

ным блоком и концом оперативной памяти.

-73-

Переносимость coreleft уникальна для DOS.

Смотрите также allocmem, brk, farcoreleft, malloc

Пример:

#include<stdio.h>

#include<alloc.h>

int main(void)

{

printf("Разница между самым верхним выделенным блоком и \n");

printf("вершиной heap равна %lu байт",(unsigned long)coreleft());

return 0;

}

cos

Функция Вычисляет косинус.

Синтаксис Вещественная версия Комплексная версия

#include <math.h> #include<complex.h>

double cos(double x); complex cos(complex x);

Файл, содержащий Вещественная версия Комплексная версия

прототип math.h complex.h

Описание cos возвращает косинус введенного значения. Угол

задается в радианах.

Косинус комплексного числа определен следующим об-

разом:

cos(z)=(exp(i*z)+exp(-i*z))/2

Возвращаемое Вещественная версия cos возвращает значение в диа-

значение пазоне от -1 до 1. Управление ошибками для этой

функции можно изменить с помощью функции matherr.

Переносимость cos поддерживается в системах UNIX и определена в

ANSI C. Комплексная версия требует С++ и неперено-

сима.

Смотрите также acos, asin, atan, atan2, complex, matherr, sin,

tan.

Пример:

#include<stdio.h>

#include<math.h>

int main(void)

{

double result;

double x = 0.5;

result = cos(x);

printf("Косинус от %1f равен %1f\n",x,result);

return 0;

}

-74-

cosh

Функция Вычисляет гиперболический косинус.

Синтаксис Вещественная версия Комплексная версия

#include <math.h> #include<complex.h>

double cosh(double x); complex cosh(complex x);

Файл, содержащий Вещественная версия Комплексная версия

прототип math.h complex.h

Описание cosh возвращает гиперболический косинус введенного

значения. (e^x+e^-x)/2

Гиперболический косинус комплексного числа опре-

делен следующим образом:

cosh(z)=(exp(z)+exp(-z))/2

Возвращаемое cosh возвращает гиперболический косинус аргумента.

значение

В случае переполнения cosh возвращает значение

HUGE_VAL с сответствующим знаком, и errno уста-

навливается в ERANGE.

Обработку ошибок для этой функции можно изменить

с помощью функции matherr.

Переносимость cosh поддерживается в системах UNIX и определена в

ANSI C. Комплексная версия требует С++ и скорее

всего непереносима.

Смотрите также acos, asin, atan, atan2, complex, cos, matherr,

sin, sinh, tan, tanh.

Пример:

#include<stdio.h>

#include<math.h>

int main(void)

{

double result;

double x = 0.5;

result = cosh(x);

printf("Гиперболический косинус от %1f равен %1f\n",x,result);

return 0;

}

country

Функция Возвращает информацию, зависимую от конкретной

страны.

Синтаксис #include<dos.h>

struct country * country(int xcode,

struct country * cp);

Файл, содержащий dos.h

прототип

Описание Функция country определяет, каким образом должна

-75-

быть сформирована такая информация, как дата,

время, денежная единица. Значения, устанавливае-

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

сии системы DOS.

Если параметр cp имеет значение -1, текущий госу-

дарственный стандарт устанавливается соответст-

венно значению аргумента xcode, который должен

быть ненулевым. В остальных случаях структура

country, указываемая адресной ссылкой cp, запол-

няется информацией зависимой от государственных

стандартов текущей страны (если xcode установлен

в 0), или страны, определяемой аргументом xcode.

Структура country определена следующим образом:

struct contry {

int co_date; /* Формат даты */

char co_curr[5]; /* Символ валюты */

char co_thsep[2]; /* Разделитель тысяч */

char co_desep[2]; /* Десятичный разделитель */

char co_dtsep[2]; /* Разделитель даты */

char co_tmsep[2]; /* Разделитель времени */

char co_currstyle; /* Изображение валюты */

char co_digits; /* Число значащих цифр */

/* в написании валюты */

char co_time; /* Формат времени */

long co_case; /* Выбор регистра */

char co_dasep[2]; /* Разделитель данных */

char co_fill[10]; /* Заполнитель */

};

Формат даты в переменной co_date имеет значение -

0 для стандарта США (месяц, день, год) - 1 для

европейского стандарта (день, месяц, год) - 2 для

японского стандарта (год, месяц, день).

Режим изображения денежных единиц задается пере-

менной co_currstyle следующим образом:

0 Символ валюты предшествует значению без про-

белов между символом и числом.

1 Символ валюты следует за значением без пробе-

лов между числом валюты и символом.

2 Символ валюты предшествует значению с пробе-

лом после символа.

3 Символ валюты следует за числом с одним про-

белом перед символом.

Возвращаемое Функция country возвращает в качестве значения

значение адресный указатель cp. В случае ошибки возвра-

щается NULL.

Переносимость country поддерживается только на DOS версии 3.0 и

выше.

Пример:

#include<dos.h>

#include<stdio.h>

#define USA 0

-76-

int main(void)

{

struct country country_info;

country(USA,&country_info);

printf("Символ валюты США : %s\n",country_info.co_curr);

return 0;

}

cprintf

Функция Осуществляет форматированный вывод на экран.

Синтаксис #include<conio.h>

int cprintf(const char *format[,argument,...]);

Файл, содержащий conio.h

прототип

Описание cprintf получает набор аргументов, применяет к

каждому аргументу спецификацию формата, содержа-

щуюся в строке формата с указателем format, и вы-

водит отформатированные данные на экран в текущее

текстовое окно. Число аргументов и спецификаций

должно быть одинаковым.

Строка пишется или напрямую в видео-память, или

через функции BIOS, в зависимости от значения

глобальной переменной directvideo.

Описание спецификации формата приведено в функции

printf. В отличие от функций fprintf и printf,

cprintf не преобразует символы перевода строки (\n)

в последовательность перевода каретки/перевода

строки (\r\n).

Возвращаемое cprintf возвращает количество выведенных символов.

значение

Переносимость cprintf поддерживается только на компьютерах IBM PC

или совместимых с ними.

Смотрите также directvideo(переменная), fprintf, printf, putch,

sprintf, vprintf.

Пример:

#include<conio.h>

int main(void)

{

/* очистить экран */

clrscr();

/* создать текстовое окно */

window(10,10,80,25);

/* вывести в него некоторый текст */

cprintf("Привет !!!\r\n");

/* ждать нажатия клавиши */

getch();

return 0;

}

-77-

cputs

Функция Выводит строку на экран.

Синтаксис #include<conio.h>

int cputs(const char * str);

Файл, содержащий conio.h

прототип

Описание cputs выводит строку str, заканчивающуюся нулем, в

текущее текстовое окно. К строке не присоединяет-

ся символ новой строки.

Строка выводится напрямую в память экрана при по-

мощи вызова BIOS, в зависимости от значения в

directvideo.

В отличие от функции puts, cputs не преобразует

символы перевода строки (\n) в последовательность

перевода каретки/перевода строки (\r\n).

Возвращаемое cputs возвращает последний выведенный символ.

значение

Переносимость cputs поддерживается только на компьютерах IBM PC

или совместимых с ними.

Смотрите также cgets, directvideo(переменная), fputs, putch, puts.

Пример:

#include<conio.h>

int main(void)

{

/* очистить экран */

clrscr();

/* создать текстовое окно */

window(10,10,80,25);

/* вывести в него некоторый текст */

cputs("Вывод в окно \r\n");

/* ждать нажатия клавиши */

getch();

return 0;

}

_creat

Функция Создает новый файл или перезаписывает существующий.

Синтаксис #include <dos.h>

int _creat(const char * path, int attrib);

Файл, содержащий io.h

прототип

Описание _creat берет аргумент attrib - слово атрибутов

DOS. Файл всегда открывается в двоичном режиме.

При успешном создании файла указатель файла уста-

навливается на начало этого файла. Файл открыва-

ется сразу для чтения и записи.

-78-

Если файл уже существует, то его размер устанав-

ливается равным 0. (Это эквивалентно удалению

файла и созданию нового файла с этим же именем).

Аргумент attrib в _creat может быть одной из сле-

дующих констант (определенных в dos.h):

FA_DRONLY Только чтение

FA_HIDDEN Скрытый файл

FA_SYSTEM Системный файл

Возвращаемое При успешном завершении _creat возвращает дескрип-

значение тор нового файла, неотрицательное число; иначе воз-

вращается -1.

В случае ошибки errno принимает одно из следующих

значений:

ENOENT - Маршрут или имя файла не найдены

EMFILE - Слишком много открытых файлов

EACCES - Отказ доступа

Переносимость _creat уникальна для DOS.

Смотрите также _chmod, chsize, _close, close, creat, creatnew,

creattemp.

Пример:

#include<sys\stat.h>

#include<process.h>

#include<string.h>

#include<stdio.h>

#include<fcntl.h>

#include<errno.h>

#include<io.h>

int main(void)

{

int handle;

char buf[] = "0123456789";

/* создать файл для чтения и записи в двоичном режиме */

if((handle = _creat("DUMMY.FIL",0)) < 0)

{

switch(errno)

{

case ENOENT: printf("Ошибка:Маршрут или имя файла не найдены.\n");

break;

case EMFILE: printf("Ошибка:Слишком много открытых файлов.\n");

break;

case EACCES: printf("Ошибка: Отказ доступа\n");

break;

default: printf("Ошибка при создании файла\n");

break;

}

exit(1);

}

/* записать в файл строку с завершающим нулевым символом */

write(handle,buf,strlen(buf)+1);

/* закрыть файл */

-79-

close(handle);

return 0;

}

creat

Функция Создает новый файл или перезаписывает существующий.

Синтаксис #include <sys\stat.h>

int creat(const char * path, int amode);

Файл, содержащий io.h

прототип

Описание Функция creat создает новый файл или подготавлива-

ет для перезаписи существующий файл, имя которого

находится в аргументе path. amode применяется

только для заново создаваемых файлов.

Файл создается в режиме, указываемом в глобальной

переменной _fmode (O_TEXT или O_BINARY).

Если файл уже существует и установлен атрибут за-

писи, функция creat усекает файл до длины 0 бай-

тов, оставляя неизменными атрибуты файлов. Если

существующий файл имеет атрибут "только чтение",

вызов функции creat потерпит неудачу и файл оста-

нется неизменным.

Вызов функции creat проверяет только бит S_IWRITE

в слове режима доступа amode. Если данный бит ра-

вен 1, файл имеет разрешение на запись. Если бит

равен 0, то для файла разрешено только чтение.

Все остальные атрибуты DOS устанавливаются равны-

ми нулю.

amode может принимать одно из следующих значений

(определенных в файле sys\stat.h):

---------------------------------------------------

Значение amode Режим доступа

---------------------------------------------------

S_IWRITE разрешение на запись

S_IREAD разрешение на чтение

S_IREAD|S_IWRITE разрешение на чтение и

запись

---------------------------------------------------

Примечание. В DOS разрешение на запись влечет за

собой разрешение на чтение.

Возвращаемое При успешном завершении возвращается неотрицатель-

значение ное целое число - новый дескриптор файла;

иначе возвращается значение -1.

В случае ошибки errno принимает одно из следующих

значений:

ENOENT - Маршрут или имя файла не найдены

EMFILE - Слишком много открытых файлов

EACCES - Отказ доступа

-80-

Переносимость creat поддерживается в системах UNIX.

Смотрите также chmod, chsize, close, _creat, creatnew, creattemp,

dup, dup2, _fmode(переменная), fopen, open, sopen,

write.

Пример:

#include<sys\stat.h>

#include<string.h>

#include<fcntl.h>

#include<io.h>

int main(void)

{

int handle;

char buf[11] = "0123456789";

/* изменить режим с текстового в двоичный */

_fmode = O_BINARY;

/* создать двоичный файл для чтения и записи */

handle = creat("DUMMY.FIL",S_IREAD|S_IWRITE);

/* записать в файл 10 байт */

write(handle,buf,strlen(buf));

/* закрыть файл */

close(handle);

return 0;

}

creatnew

Функция Создает новый файл.

Синтаксис #include <dos.h>

int creatnew(const char * path, int mode);

Файл, содержащий io.h

прототип

Описание creatnew идентична функции _creat, за исключением

того, что если файл существует, то creatnew возв-

ращает ошибку и не изменяет файл.

Аргумент mode в creatnew может быть одной из сле-

дующих констант (определенных в dos.h):

FA_DRONLY Только чтение

FA_HIDDEN Скрытый файл

FA_SYSTEM Системный файл

Возвращаемое При успешном завершении creatnew возвращает дескрип-

значение тор нового файла, неотрицательное число; иначе воз-

вращается -1.

В случае ошибки errno принимает одно из следующих

значений:

EEXIST - Файл уже существует

ENOENT - Маршрут или имя файла не найдены

EMFILE - Слишком много открытых файлов

-81-

EACCES - Отказ доступа

Переносимость creatnew уникальна для DOS 3.0 и не работает на

более ранних версиях DOS.

Смотрите также close, _creat, creat, creattemp, dup,

_fmode(переменная), open.

Пример:

#include<stdlib.h>

#include<errno.h>

#include<dos.h>

#include<io.h>

int main(void)

{

int handle;

char buf[11] = "0123456789";

/* попытка создать несуществующий файл */

handle = creatnew("DUMMY.FIL",0);

if(handle == -1)

printf("DUMMY.FIL уже существует\n");

else

{

printf("DUMMY.FIL успешно создан\n");

write(handle,buf,strlen(buf));

close(handle);

}

return 0;

}

creattemp

Функция Создает уникальный файл в директории, указываемой

в маршруте.

Синтаксис #include <dos.h>

int creattemp(char * path, int attrib);

Файл, содержащий io.h

прототип

Описание Файл создается в режиме, указываемом в глобальной

переменной _fmode (O_TEXT или O_BINARY).

path является именем маршрута, заканчивающимся

символом (\). Уникальное имя файла выбирается в ди-

ректории, указываемой в аргументе path. Имя ново-

го созданного файла хранится в строке path. path

должен быть достаточной длины для размещения име-

ни результирующего файла. Этот файл автоматически

не удаляется при завершении программы.

creattemp берет аргумент attrib - слово атрибутов

DOS. Файл всегда открывается в двоичном режиме.

При успешном создании файла указатель файла уста-

навливается на начало этого файла. Файл открыва-

ется сразу для чтения и записи.

-82-

Аргумент attrib в creattemp может быть одной из

следующих констант (определенных в dos.h):

FA_DRONLY Только чтение

FA_HIDDEN Скрытый файл

FA_SYSTEM Системный файл

Возвращаемое При успешном завершении возвращается дескрип-

значение тор нового файла, неотрицательное число; иначе воз-

вращается -1.

В случае ошибки errno принимает одно из следующих

значений:

ENOENT - Маршрут или имя файла не найдены

EMFILE - Слишком много открытых файлов

EACCES - Отказ доступа

Переносимость creattemp уникальна для DOS 3.0 и не работает на

более ранних версиях DOS.

Смотрите также close, _creat, creat, creatnew, dup,

_fmode(переменная), open.

Пример:

#include<string.h>

#include<stdio.h>

#include<io.h>

int main(void)

{

int handle;

char pathname[128];

strcpy(pathname,"\\");

/* создать уникальный файл в корневом каталоге */

handle = creattemp(pathname,0);

printf("Был создан файл %s\n",pathname);

close(handle);

return 0;

}

cscanf

Функция Выполняет форматированный ввод с консоли.

Синтаксис #include<conio.h>

int cscanf(char * format[,address,...]);

Файл, содержащий conio.h

прототип

Описание cscanf считывает с консоли и просматривает набор

вводимых полей по одному символу. Затем каждое

поле форматируется в соответствии со спецификаци-

ей формата, передаваемой функции cscanf в строке

формата format. Наконец, cscanf помещает отформа-

тированный ввод по адресам, следующим за аргумен-

том format, и отображает введенные символы на эк-

ране. Количество спецификаций формата, адресов и

вводимых полей должно быть одинаковым. Специфика-

-83-

ция формата приведена в описании функции scanf.

По многим причинам cscanf может прекратить скани-

рование определенного поля до его нормального за-

вершения (символ пробела), или вообще завершить

ввод. Описание этих причин вы найдете в описании

функции scanf.

Возвращаемое cscanf возвращает число успешно введенных,

значение преобразованных и сохраненных полей; возвращаемое

значение не включает просмотренные, но не сохра-

ненные поля. Если ни одно поле не было сохранено,

то возвращается значение 0.

Если cscanf пытается считать конец файла, то воз-

вращается значение EOF.

Переносимость cscanf уникальна для DOS.

Смотрите также fscanf, getche, scanf, sscanf.

Пример:

#include<conio.h>

int main(void)

{

char string(80);

/* очистить экран */

clrscr();

/* запросить ввод от пользователя */

cprintf("Введите строку:");

/* считать строку */

cscanf("%s",string);

/* вывести введенную строку */

cprintf("Вы ввели следующую строку: %s",string);

return 0;

}

ctime

Функция Преобразовывает дату и время в строку.

Синтаксис #include <time.h>

char * ctime(const time_t * time);

Файл, содержащий time.h

прототип

Описание Функция ctime преобразует время, адресный указа-

тель которого находится в аргументе time (это

значение возвращается функцией time) в 26-сим-

вольную строку следующего вида, заканчивающуюся

символами новой строки и нуля:

Mon Nov 21 11:31:54 1983\n\0

Все поля имеют постоянную ширину.

Глобальная переменная timezone (тип long) должна

содержать разницу в секундах между временем по

Гринвичу (GMT) и местным стандартным временем (по

-84-

стандарту PST timezone равна 8*60*60). Глобальная

переменная daylight имеет ненулевое значение

только, если применяется стандартное преобразова-

ние летнего времени для USA.

Возвращаемое Функция ctime возвращает указатель на символьную

значение строку, содержащую дату и время. Данная строка

является статической переменной, которая переза-

писывается при каждом вызове функции ctime.

Переносимость ctime поддерживается на системах UNIX и определена

в ANSI C.

Смотрите также asctime, daylight(переменная), difftime, ftime,

getdate, gmtime, localtime, settime, time,

timezone(переменная), tzset.

Пример:

#include<stdio.h>

#include<time.h>

int main(void)

{

time_t t;

t = time(NULL);

printf("Сейчас: %s\n",ctime(&t));

return 0;

}

ctrlbrk

Функция Устанавливает программу обработки Ctrl-Break.

Синтаксис #include<dos.h>

void ctrlbrk(int(*handler)(void));

Файл, содержащий dos.h

прототип

Описание Функция ctrlbrk устанавливает новую функцию обра-

ботки прерываний, адресный указатель которой на-

ходится в переменной handler. Вектор прерывания

0x23 модифицируется для вызова названной функции.

Названная функция не может вызываться непосредст-

венно. Функция ctrlbrk вызывает программу обра-

ботки прерываний системы DOS, которая, в свою

очередь, вызывает названную функцию.

Функция обработки прерываний может выполнять лю-

бое количество операций и системных вызовов. Дан-

ная функция не должна возвращаться непосредствен-

но в программу; программа обработки прерывания

возвращает 0 для завершения текущей программы, в

противном случае программа продолжает свою рабо-

ту.

Возвращаемое Функция ctrlbrk не возвращает никакого значения.

значение

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]