prosdo.ru 1 2 ... 9 10
CCCCCCCC III III


CCCCCCCCCC III III

CCC CCC III III

CCC CC III III

CCC III IIII

CCC III IIIII

CCC III IIIIII

CCC III III III

CCC III III III

CCC IIIIII III

CCC IIIII III

CCC CC IIII III

CCC CCC III III

CCCCCCCCCC III III

CCCCCCCC III III

ЛГУ

СОДЕРЖАНИЕ

1. Язык СИ. Руководство программиста. Функции стандартной библиотеки........................................................ 2

1.1. Форматный ввод/вывод........................................ 8

1.2. Нефайловая работа с терминалом..............................13

1.3. Управление распределением динамической памяти...............14

1.4. Работа со строками и символами..............................16

1.5. Средства отладки............................................23

2. Библиотека математических функций CMLIB.OBJ.......................26

3. Графбиблиотека CGLIB.OBJ..........................................28

4. Библиотека системных функций ОС RT11 CRLIB.OBJ....................30

5. Язык СИ. Руководство оператора....................................32

5.1. Стадии подготовки программы.................................32

5.2. Проблемы промежуточных файлов...............................34

5.3. Эмуляция EIS................................................35

5.4. Вычисление с плавающей запятой..............................35

5.5. Инициализация FPU...........................................36

5.6. Форматный вывод чисел с плавающей запятой...................36

5.7. Оптимизация.................................................36

5.8. Компоновка..................................................37

5.9. Создание автономных программ................................37

5.10.Сообщения оператору.........................................38


6. Дополнения к комплекту СИ.........................................39

6.1. Ввод и обработка командной строки...........................41

6.2. Управление стартовыми действиями............................42

7. Пакет работы с терминалом.........................................43

7.1. Обновление экрана...........................................43

7.2. Запуск......................................................45

7.3. Вывод.......................................................45

7.4. Ввод........................................................45

7.5. Завершение работы...........................................45

7.6. Оптимизация движения курсора................................46

8. Графический редактор..............................................52

9. Краткое описание компилятора СИ фирмы DEC.........................53

10.Перечень ошибок...................................................54

1. ЯЗЫК СИ. РУКОВОДСТВО ПРОГРАММИСТА.

ФУНКЦИИ СТАНДАРТНОЙ БИБЛИОТЕКИ

Многие обьекты, которые встречаются в настоящем описании, используются, в основном, через указатели на них, поэтому часто указатели на обьект при описании отождествляются с самим обьектом. Файл, например, определяется дескриптором файла - структурой типа "FILE" (тип описан в файле "STDIO.H"), однако, т.к. на файл ссылаются при помощи указателя на его дескриптор, этот указатель при описании отождествляют с файлом. Это, как правило, не создает неоднозначностей.

При использовании данного пакета ввода/вывода программа может открыть до 16. файлов. Вся информация об открытом файле содержится в так называемом дескрипторе файла - структуре типа FILE. Этот тип, а также некоторые другие переменные и определения описаны в файле "STDIO.H", который должен быть включен в начало каждого файла, содержащего функции данного пакета. Если существует описание


FILE *iop; /* указатель на дескриптор файла */

,то выражение "файл iop" в дальнейшем описании будет означать "файл,

на дескриптор которого указывает iop". В файле "STDIO.H" определены

символы "NULL" (0) и EOF (-1). Эти символы определяют выделенные

значения, возвращаемые некоторыми функциям для информации об ошибке

или нестандартном событии.

При старте программы, написанной на "СИ", автоматически открываются (если это явно не подавлено) три файла:

stdin - файл стандартного ввода

stdout - Файл стандартного вывода

stderr - файл стандартного вывода ошибок

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

соответствующими аргументами в командной строке файлы "STDIN" и

"STDOUT" могут быть перенаправлены на другие устройства и файлы (см.

"руководство пограммиста. библиотеки. Исполняющая система").

fopen

char *name; /* спецификация файла */

char *mode; /* способ открытия */

file *

fopen(name,mode);

открывает новый или существуюший файл. Спецификация файла задается

в строке "name" в формате CSI. Если в имени файла отсутствует имя

устройства, то предполагается "DK:", если отсутствует длина, то

предполагается "[0]" (для файлов, открываемых на чтение, длина

игнорируется). Если устройство нефайловое,например "TT:", "LP:" и

т.п., то можно опустить имя и тип файла. Отметим, что пустая

спецификация файла не расширится в "DK:", а будет зафиксирована

ошибка. примеры допустимых имен:

RK1:MAMA.FOR

RK1:MAMA.FOR

AMA.FOR

DX0:PROG10.C[12]

KISS.TXT

LP:

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

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

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


сдедующих ключей:

R - открытие существующего файла на ввод.

W - открытие нового файла на вывод.

N - открытие файла в "двоичном" (не символьном) режиме:

в ОС "UNIX" в символьных файлах строка ограничивается символом '\N'

(<ПС>), символ '\R' (<ВК>) отсутствует.

В ОС RT11 ограничителем строки является комбинация "\R\N". т.к. наиболее часто используется ввод и вывод именно символьных файлов, для совместимости по умолчанию файл открывается таким образом, что

при вводе '\R' выбрасываются, а при выводе вставляются перед '\N'. однако, при чтении не символьного (двоичного) файла этот режим может приводить к ошибкам, и следует открывать файл с ключом 'N'.

U - производить посимвольный вывод

имеет смысл только для файлов, открытых на терминал (в противном случае игнорируется); обычно вывод на терминал выполняется с буферизацией и по .PRINT, при открытии же файла с ключом 'U' вывод будет выполняться посимвольно (без буферизации) по .TTYOUT (ввод с терминала всегда осуществляется по .TTYIN, и для посимвольного ввода необходимо воспользоваться функцией $ttymode()). Заметим, что stderr открыт с ключом 'U'.

D - позволяет выполнить нефайловое открытие файлового устройства: без этого ключа при попытке выполнить "fopen("RK1:","R");" мы получим ошибку, однако "fopen("RK1:","RD");" выполнится без ошибки. Нефайловое открытие устройства с файловой структурой полезно при создании программ, работающих непосредственно с каталогом (примеры - fwild() и rdir() из CRLIB) или программ, предназначенных для работы с дисками, на котрых отсутствует файловая система ОС RT11. Ошибка будет возникать, если ключ 'D' используется с ключом 'W', а также если устройство, к которому происходит обращение, имеет нестандартную файловую структуру (например "MT:").

Один из ключей 'R' или 'W' должен присутствовать (но не оба!!!), остальные ключи могут присутствовать или отсутствовать.

При удачном открытии fopen() резервирует (по malloc()) область для дескриптора файла и буфера (около 530. байт) и возвращает указатель на нее. При неудачном открытии fopen() возвращает NULL (0).


При открытии на чтение существующего файла в глобальную переменную "$$FLEN" заносится его длина (0 для устройств с нефайловой структурой).

Если драйвер устройства, указанного при открытии файла, не загружен, то fopen() загружает его, резервируя память по malloc(). Драйвер остается загруженным, а память под него зарезервированной до окончания задачи.

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

Ограниченные возможности непосредственного доступа к записям в файле предоставляются функциями ftell() - fseek().

Приведем пример использования функции fopen() на примере простой программы, копирующей поизвольный файл "a.txt" в файл "b.txt".

#include

char inname[]="A.TXT"; /* имя входного файла */

char outname[]="B.TXT"; /* имя выходного файла */

main()
register c;

file *inf; /* файл ввода */

file *outf; /* файл вывода */

if((inf=fopen(inname,"RN")) == null)

error("ошибка открытия файла ввода \"%s\",

inname);

if((outf=fopen(outname,"WN")) == null)

error("ошибка открытия файла вывода \"%s\",

outfname);

/* копирование */

while((c = getc(inf)) != eof) putc(c);
freopen

char *name; /* имя файла */

char *mode; /* способ открытия */

file *iop;

file *

freopen(name,mode,iop);

freopen() аналогична fopen(), но использует уже существующий дескриптор файла, на который указывает iop. Файл, ранее связанный с iop, закрывается. Если произошла ошибка открытия файла, дескриптор файла освобождается. Ошибки закрытия файла игнорируются.

freopen() нормально возвращает "iop", и NULL при ошибке.


fclose

file *iop; /* указатель на дескриптор файла */

fclose(iop);

Закрывает файл iop и освобождает память, занятую под дескриптор. возвращает 0, если ошибок нет, и -1 при ошибке. Заметим, что stderr закрыть нельзя. Последний блок файла, открытого для записи на устройстве с произвольным доступом (диске) дополняется нулями.

fpclose

file *iop;

fpclose(iop);

Функция fpclose() аналогична fclose(), однако если файл был открыт на вывод и при его закрытии произошла ошибка, то файл не закрывается (т.е. теряется).

fpurge

file *iop;

fpurge(iop);

Освобождает канал, не закрывая файла, и освобождает память, занятую под дескриптор. Если файл был открыт на вывод, он теряется.

getchar, getc

file *iop;

getchar();

getc(iop);

getchar() вводит один символ из стандартного файла ввода (stdin). getc() вводит один символ из файла iop. Возвращают EOF (-1) при ошибке или при конце файла. Если файл ввода открыт без указания ключа 'N' (по умолчанию stdin открывается именно так), то при вводе символ '\R' () будет игнорироваться.

putchar, putc

char c;

file *iop;

putchar(c);

putc(c,iop);

putchar() выводит один символ в стандартный файл вывода (stdout).

putc() выводит один символ в файл iop. Нормально возвращают значение

символа и eof при ошибке. Если выходной файл открыт без указания

ключа 'n', то при выводе символа '\N' (<ПС>) перед ним будет

добавлен символ '\R' (<ВК>).

ungetc

char c;

file *iop;

ungetc(c,iop);

возвращает один символ в указанный файл ввода (символ сохраняется в

специально отведенном элементе дескриптора файла). При попытке

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

Ппрерывание программы по инструкции BPT.


getw

file *iop;

getw(iop);

читает из файла iop два байта и возвращает их как одно 16-ти

разрядное слово. Никакого выравнивания не производится. Если вы

читаете двоичный файл, его необходимо открыть с ключом 'N'.

Используйте feof() и ferror() для проверок на конец файла и ошибки.

putw

int word;

file *iop;

putw(word,iop);

записывает слово word в файл iop побайтно (сначала младший байт),

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

с ключом 'N', иначе возможно искажение информации и перекосы.

Возвращает 0 при удачном завершении и EOF при ошибке.

gets, fgets, fgetss

char *buffer;

int maxbytes;

file *iop;

char *

gets(buffer);

char *

fgets(buffer,maxbytes,iop);

char *

fgets(buffer,maxbytes,iop);

gets() - вводит строку в буфер "buffer" из стандартного файла

ввода. Ограничение на длину вводимой строки отсутствует.

Строкой считается последовательность символов,

заканчивающаяся символом '\N'. Символ '\N' заменяется в

буфере на '\0'.

fgets() - вводит строку из файла iop в буфер "buffer". Если строка

длиннее maxbytes-1 байт, то строка обрезается и '\N'

добавляется. Строка в буфере всегда заканчивается сим­волами '\N' '\0'.

fgetss() - делает то же, что и fgets(), однако '\N' в буфер не заносится, строка ограничивается нулем. Это совместимо с gets() и fget(), но не совпадает со стандартами библиотеки ОС UNIX.

Нормально возвращают buffer, при ошибке или конце файла возвращают NULL.

puts, fputs, fputss

char *s;

file *iop;

puts(s);

fputs(s,iop);

fputss(s,iop);

puts() - записывает строку s в стандартный файл вывода. В конец строки добавляется '\N'.


fputs() - записывает строку s в указаннный файл. '\N' в конец строки

не добавляется.

fputss() - записывает строку s в указанный файл. В конец строки

добавляется '\N'. Функции возвращают EOF в случае ошибки

или конца файла.

fread

struct object *op;

int nitem;

file *iop;

fread(op, sizeof(*op), nitem, iop);

вводит указанное (nitem) число двоичных записей (записи неформатные,

функции fread() - fwrite() не имеют никакого отношения к функциям

fget() - fput()) из указанного файла в буфер, на который указывает

op. Длина записи указывается во втором аргументе (в примере - как

sizeof(*op)). Возвращает число фактически введенных записей. Оно

может быть нулем, если при вводе возникли ошибки или был достигнут

конец файла.

fwrite

struct object *op;

int nitem;

file *iop;

fread(op, sizeof(*op), nitem, iop);

выводит "nitem" двоичных записей в файл iop из буфера, на который

указывает op. Длина записи указывается во втором аргументе (в

примере - как sizeof(*op)). Возвращает число фактически выведенных

записей. Оно может быть нулем, если при записи возникли ошибки или

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

fget

char *buffer;

int maxbytes;

file *iop;

fget(buffer, maxbytes, iop);

вводит форматную запись (запись в формате RSX, каждой записи (строке)

предшествует счетчик байт, занимающий 2 байта) из файла iop в

"buffer". Если длина записи превосходит maxbytes, то в буфер будет

занесено maxbytes байт, остальные байты этой записи будут потеряны.

В ОС RT11 функцию fget() можно использовать для чтения файлов, записанных при помощи функции fput(), и для перекодирования файлов, записанных в RSX. Файл должен быть открыт с ключом 'N'.


следующая страница >>