- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •Глава 2. Глобальные переменные.
- •Int main(void)
Int main(void)
{
void *buf;
int handle, bytes;
buf = malloc(200);
/* Создать в текущей директории файл TEST.$$$ и записать в
него 200 байт. Если такой файл уже существует, то он будет
перезаписан */
if((handle = open("TEST.$$$",O_CREAT|O_WRONLY|O_BINARY,
S_IWRITE|S_IREAD)) == -1)
{
printf("Ошибка при открытии файла\n");
exit(1);
}
if((butes = _write(handle, buf, 200)) == -1)
{
printf("Ошибка при записи.\n");
exit(1);
}
printf("Записано %d байт",bytes);
= 289 =
close(handle); /* прим. пер. в оригинале close отсутсвует */
return 0;
}
write
Функция Записывает данные в файл.
Синтаксис #include<io.h>
int write(int handle, void *buf, unsigned len);
Файл, содержащий io.h
прототип
Описание write записывает буфер, содержащий данные, в файл
или на устройство, соответствующее номеру handle.
handle - это логический номер, полученный в опе-
рациях creat, open, dup, dup2.
Данная функция делает попытку записи len байтов
из буфера, адресуемого параметром buf, в файл,
соответствующий номеру handle. За исключением си-
туации, при которой функция write записывает дан-
ные в текстовый файл, количество байтов, записан-
ное в файл, будет не больше, чем требуемое коли-
чество.
Максисмальное число байтов, которое write может
записать 65534, т.к. 65535(0xFFFF) тоже самое,
что и -1, которая является возвращаемым кодом
ошибки для write.
В текстовых файлах если write встречает символ
перевода строки(LF), она выводит пару CR/LF.
Если число действительно записанных байт меньше,
чем задано, то должна быть выдана ошибка и воз-
можно это говорит о том, что на диске нет места.
Для дисков и дисковых файлов, запись всегда осу-
ществляется с текущего файлового указателя. Для
устройств, байты посылаются непосредственно на
устройства.
Для файлов, открытых с ключем O_APPEND, файловый
указатель устанавливается на EOF, прежде чем бу-
дет осуществлена запись данных.
Возвращаемое write возвращает число записанных байтов. При
значение записи в текстовый файл генерируемые символы
= 290 =
возврата каретки CR не считаются. В случае ошибки
write возвращает -1, и устанавливает глобальную
переменную errno в:
EACCED - Permission denied;
EBADR - Bad file number.
Переносимость write поддерживается на UNIX-системах.
Смотрите также creat, lseek, open, read, _write.
= 291 =
Глава 2. Глобальные переменные.
Turbo C++ предоставляет вам набор предопределенных глобальных пе-
ременных, помогающих работать с наиболее часто встречающимися зада-
чами (дата, время, аргументы командной строки и т.п.). Они и описаны
в этой главе.
_8087
Функция Флаг состояния сопроцессора.
Синтаксис extern int _8087;
Объявлено в dos.h
Описание Переменная _8087 устанавливается в нену-
левое значение (1, 2 или 3), если при загрузке
обнаруживается сопроцессор с плавающей точкой
(8087, 80287 или 80387 соответственно). Иначе пе-
ременная устанавливается в 0. Эта проверка может
быть заменена на установку переменной окружения в
YES или NO. (Команды SET 87=YES или SET 87=NO;
пробелов в знаке равенства быть не должно). В
этом случае переменная _8087 установится в 1 или
0. Более подробная информация об этой переменной
содержится в Главе 4 Руководства программиста
"Модели памяти, операции с плавающей точкой и
оверлеи.
_argc
Функция Содержит количество аргументов командной строки.
Синтаксис extern int _argc;
Объявлено в dos.h
Описание _argc имеет значение argc, передаваемое функ-
ции main при запуске программы.
_argv
Функция Массив указателей на аргументы командной строки.
Синтаксис extern char * _argv[];
Объявлено в dos.h
= 292 =
Описание _argv указывает на массив, содержащий аргу-
менты командной строки (элементы argv[]), переда-
ваемые функции main при запуске программы.
_ctype
Функция Массив атрибутов символа.
Синтаксис extern char _ctype[];
Объявлено в ctype.h
Описание _ctype.h является массивом атрибутов символа,
индексируемого по значению ASCII + 1. Каждый эле-
мент является набором бит, описывающих символ.
daylight
Функция Определяет, должна ли производиться установка лет-
него времени.
Синтаксис extern int daylight;
Объявлено в time.h
Описание daylight используется функциями времени и
даты. Устанавливается функциями tzset, ftime,
localtime в "1" для летнего времени, "0" для
стандартного времени.
directvideo
Функция Флаг управления видео выводом.
Синтаксис extern int directvideo;
Объявлено в conio.h
Описание directvideo управляет выводом на консоль (из
cputs, например) напрямую через видео RAM
(directvideo=1) или через вызов ROM BIOS
(directvideo=0). Значением по умолчанию является
directvideo=1 (консольный вывод идет напрямую че-
рез видео RAM). Чтобы использовать directvideo=1,
видео контроллер должен быть идентичным по отно-
шению к IBM. Установка directvideo=0 позволяет
выводить на консоль на любом компьютере, совмес-
= 293 =
тимом по IBM BIOS.
environ
Функция Доступ к переменным окружения DOS.
Синтаксис extern char * environ[];
Объявлено в dos.h
Описание environ является массивом указателей на
символьные строки; используется для доступа и из-
менения переменных окружения DOS. Каждая строка
массива имеет следующую форму:
envvar = varvalue
где envvar - это имя переменной окружения (такой
как PATH), а varvalue - это строковое значение,
которое присваивается переменной envvar (такое
как C:\BIN;C:\DOS). Строка varvalue может быть
пустой.
Когда программа начинает выполняться, атрибуты
операционной среды MS-DOS передаются непосредст-
венно в программу. Заметим, что envp, третий ар-
гумент функции main, равен первоначальному значе-
нию переменной environ.
Массив environ может использоваться функцией
getenv; однако функция putenv является единствен-
ной функцией, которая может изменять, удалять и
добавлять содержимое массива environ. Хотя и су-
ществует возможность изменять размеры и переме-
щать массив окружения процесса, переменная
environ автоматически регулируется таким образом,
что она всегда указывает на массив.
errno, _doserrno, sys_errlist, sys_nerr
Функция Позволяет функции perror печатать сообщение об
ошибке.
Синтаксис extern int errno;
extern int _doserrno;
extern char * sys_errlist[ ];
extern int sys_nerr;
Объявлено в errno.h,stdlib.h(errno,_doserrno,
= 294 =
sys_errlist,sys_nerr)
dos.h(_doserrno)
Описание errno, sys_errlist и sys_nerr) использую-
тся в функции perror для печати сообщений об
ошибке. _doserrno это переменная, которая переда-
ет многие коды ошибок DOS переменной errno; одна-
ко perror не использует непосредственно перемен-
ную _doserrno.
_doserrno. Когда при системном вызове DOS
происходит ошибка, текущий код ошибки DOS присваи-
вается переменной _doserrno. Переменная errno по-
лучает параллельное значение кода, соответствующее
операционной системе UNIX.
errno. Где бы ни произошла ошибка при системном
вызове, переменная errno указывает на тип ошибки.
Иногда errno и _doserrno бывают идентичны. В ос-
тальных случаях errno не содержит действительный
код ошибки DOS, который содержится в _doserrno.
При некоторых ошибках их код может присваиваться
только переменной errno, но не _doserrno.
sys_errlist. Чтобы обеспечить лучший контроль за
выдачей сообщений об ошибках, существует массив
строк сообщений, хранящийся в sys_errlist. errno
может использоваться в качестве индекса на мас-
сив, где каждый индекс соответствует требуемой
строке. Строка не содержит не одного символа пе-
рехода на новую строку.
sys_nerr. Данная переменная представляет собой
число строк сообщений об ошибках в переменной
sys_errlist.
Следующая таблица дает мнемонические значения для
сообщений, хранящихся в переменной sys_errlist.
ЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂ
Мнемомика Значение
ЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂ
E2BIG Список аргументов слишком длинный.
EACCES Отказ доступа.
EBADF Неверный номер файла.
ECONTR Блоки памяти разрушены.
ECURDIR Попытка удаления текущего директория.
EDOM Ошибка области определения.
EEXIST Файл уже существует.
EFAULT Неизвестная ошибка.
= 295 =
EINVACC Неверный код доступа.
EINVAL Неверный аргумент.
EINVDAT Неверные данные.
EINVDRV Неверная спецификация устройства.
EINVENV Неверное окружение.
EINVFMT Неверный формат.
EINVFNC Неверный номер функции.
EINVMEM Неверный адрес блока памяти.
EMFILE Слишком много открытых файлов.
ENMFILE Больше нет файлов.
ENODEV Не существует такого устройства.
ENOENT Не существует такого файла или директории.
ENOEXEC Ошибка формата.
ENOFILE Не существует такого файла или директории.
ENOMEM Не хватает памяти.
ENOPATH Маршрут не найден.
ENOTSAM Не такое же устройство.
ERANGE Результат превышает допустимые пределы.
EXDEV Перекрестная связь между устройствами.
EZERO Ошибка 0.
ЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂ
Следующий список дает мнемонику действительных
кодов ошибок DOS, которые присваиваются перемен-
ной _doserrno. Значения в _doserrno могут содер-
жать, или не содержать, (через errno) эквивалент-
ные строки сообщений об ошибках в sys_errlist.
ЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂ
Мнемоника Код ошибки DOS
ЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂ
E2BIG Неверное окружение.
EACCESS Отказ доступа.
EACCESS Неверный доступ.
EACCESS Текущий директорий.
EBADF Неверный дескриптор.
EFAULT Зарезервировано.
EINVAL Неверные данные.
EINVAL Неверная функция.
EMFILE Слишком много открытых файлов.
ENOENT Нет такого файла или директрория.
ENOEXEC Неверный формат.
ENOMEM Разрушен Mcb.
ENOMEM Выход за пределы памяти.
ENOMEM Неверный блок.
EXDEV Неверное устройство.
EXDEV Не такое же устройство.
ЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂ
Пользуйтесь документом "Справочное руководство
программиста по DOS". В нем вы найдете подробное
= 296 =
описание кодов ошибок DOS.
Пример:
#include<errno.h>
#include<stdio.h>
extern char *sys_errlist[];
main()
{
int i=0;
while(sys_errlist[i++]) printf("%s\n",sys_errlist[i]);
return 0;
}
_fmode
Функция Режим преобразования файла по умолчанию.
Синтаксис extern int _fmode;
Объявлено в fcntl.h
Описание Данная переменная определяет, в каком режиме
(текстовом или двоичном), файлы будут открываться
и преобразовываться. По умолчанию, значением
_fmode является O_TEXT, что означает, что файлы
будут читаться в текстовом режиме. Если же _fmode
получит значение O_BINARY, файлы будут открыты и
прочитаны в двоичном режиме. (O_TEXT и O_BINARY
определены в файле fcntl.h).
В текстовом режиме, при вводе, комбинация возврат
каретки/перевод строки (CR/LF) преобразуется в
один символ перевода строки (LF). При выводе,
преобразование обратное - символы LF преобразуют-
ся в комбинацию CR/LF.
В двоичном режиме такое преобразование не произ-
водятся.
Вы можете изменить режим по умолчанию, устанавли-
ваемый в _fmode, если для библиотечных функций
fopen, fdopen, frеopen вы определите аргумент
type, равный t (для текстового режима) или b (для
двоичного режима). Также, аргумент access функции
open может содержать либо O_BINARY, либо O_TEXT,
который явно определяет режим (текстовый или дво-
ичный) открытия файла (он определяется аргументом
= 297 =
pathname функции open).
_heaplen
Функция Содержит длину локального heap.
Синтаксис extern unsigned _heaplen;
Объявлено в dos.h
Описание _heaplen определяет размер локального heap в ма-
лых моделях данных (tiny, small, mediuim).
_heaplen не существует в больших моделях данных
(compact, large, huge), т.к. они не имеют локаль-
ного heap.
В моделях small и medium размер сегмента данных
вычисляется следующим образом:
data segment [small,medium] = global data +
heap + stack
где размер стека может быть получен по _stklen.
Если _heaplen установлен в 0, то программа выде-
ляет 64Кбайт для сегмента данных, и действитель-
ный размер heap равен:
64К - (global data + stack) байт
По умолчанию _heaplen равен 0, так что вам выде-
ляется сегмент данных 64К, пока вы не укажете
другое значение _heaplen.
В модели tiny все (включая код) находится в одном
сегменте, поэтому в сегмент данных включается код
и 256 байт для PSP.
data segment [tiny] = 256 + code + global data +
heap + stack
Если _heaplen равен 0 в модели tiny, то действи-
тельный размер heap получается вычитанием PSP,
кода, глобальных данных и стека из 64К.
В моделях compact и large не существует локально-
го heap, поэтому сегмент данных равен
data segment [compact,large] = global data +
stack
= 298 =
В модели huge стек является отдельным сегментом,
а каждый модуль имеет собственный сегмент данных.
Смотрите также _stklen.
_openfd
Функция Массив режимов доступа.
Синтаксис extern unsigned int _openfd[];
Объявлено в io.h
Описание _openfd является массивом режимов доступа для файлов
и устройств.
_osmajor,_osminor
Функция Содержит старший и младший номер версии DOS.
Синтаксис extern unsigned char _osmajor;
extern unsigned char _osminor;
Объявлено в dos.h
Описание Старший и младший номер версии доступны при помощи
переменных _osmajor и _osminor. _osmajor содержит
номер версии, а _osminor - расширение. Например,
если вы работаете с версией DOS 3.2, то _osmajor
будет иметь значение 3, а _osminor - 20. Эти пе-
ременные могут оказаться полезны, если вы захоти-
те написать программы, функционирующие под управ-
лением операционной системы MS-DOS версий 2.х и
3.х. Некоторые библиотечные функции работают
по-разному в зависимости от номера версии DOS, в
то время как другие работают только с версией DOS
3.х. (Например, посмотрите функции _open,
creatnew, ioctl в справочной секции данного руко-
водства).
_psp
Функция Содержит адрес префикса сегмента программы (PSP).
Синтаксис extern unsigned int _psp;
Объявлено в dos.h
= 299 =
Описание _psp содержит адрес сегмента PSP (префикс прог-
раммного сегмента) для текущей программы. PSP
представляет собой дескритор процесса DOS; он со-
держит специальную информацию DOS о программе.
Подробную информацию о PSP вы найдете в документе
"Справочное руководство программиста по DOS".
_stklen
Функция Содержит размер стека.
Синтаксис extern unsigned _stklen;
Объявлено в dos.h
Описание _stklen содержит размер стека для всех шести моде-
лей памяти. Минимально допустимый размер стека
равен 128 словам; если вы указываете меньшее зна-
чение, то _stklen автоматически расширяется до
минимума. Размер стека по умолчанию равен 4К.
В моделях small и medium размер сегмента данных
вычисляется следующим образом:
data segment [small,medium] = global data +
heap + stack
где размер heap может быть получен через
_heaplen.
В модели tiny все (включая код) находится в одном
сегменте, поэтому в сегмент данных включается код
и 256 байт для PSP.
data segment [tiny] = 256 + code + global data +
heap + stack
В моделях compact и large не существует локально-
го heap, поэтому сегмент данных равен:
data segment [compact,large] = global data +
stack
В модели huge стек является отдельным сегментом,
а каждый модуль имеет собственный сегмент данных.
Смотрите также _heaplen.
Пример:
= 300 =
#include<stdio.h>
/* Установить больший размер стека, чем используется по умолчанию */
/* Это обьявление должно находится в глобальной области определения */
extern unsigned _stklen = 54321U;
