Наиболее употребительные заголовочные файлы.
ALLOC.H – функции динамического выделения памяти;
CONIO.H – функции для работы с экраном;
CTYPE.H – функции для работы с символами ANSI языка Си;
DIR.H – функции для работы с каталогами;
DOS.H – функции интерфейса DOS;
ERRNO.H – определяет коды ошибок ANSI языка Си;
FCNTL.H – определяет константы, используемые функцией open;
GRAPHICS.H – графические функции;
MATH.H – содержит разные определения, используемые математической библиотекой ANSI языка Cи;
SHARE.H – совместное использование файлов;
STDIO.H – объявления для стандартных потоков ввода-вывода;
SIRSTREAM.H – классы потоков ввода-вывода на базе массивов
TIME.H – функции системного времени.
#include<graphics.h>
main()
{int gd=DETECT, gm;
/*графический драйвер, для него задан режим автоматического выбора DETEC, gm – способ представления графической информации */
initgraph (&gd,gm.,””);
circle(100,120,80); /* вычерчивание окружности */
getch(); /* ожидание нажатия любой клавиши */
closegraph(); /* переход в текстовый режим */
}
В C отсутствует операторы ввода - вывода. Ввод, вывод организуется с помощью библиотечных функций, и эта возможность делает компилятор машинно-независимым. Библиотечные функции можно разделить на 2-е категории, представляющие два основных способа ввода - вывода.
1) Последовательный или буферизованный доступ.
2) Ввод, вывод нижнего уровня, или прямой доступ.
Наиболее распространен последовательный доступ. При последовательном доступе обмен производится через специальный буфер, резервируемый системой ввода - вывода.
Компилятор С рассматривает ввод - вывод, как поток байтов, которые поступают последовательно байт за байтом. Каждый поток связывается с файлом на магнитном диске, или файлом, который поставлен в соответствии физическому устройству, например клавиатуре.
Связь потока с файлом устанавливается при его открытии, т.к С является языком системного программирования, наиболее часто используется функция для ввода - вывода символов. В некоторых реализациях эти функции описаны в головном файле stdio.h.
Этот файл можно подключить к программе с помощью директивы include препроцессора:
# include < stdio.h >
Содержащие файла stdio.h зависит от реализации, обычно в него включаются:
1) макроопределение, наиболее часто встречающихся функций ввода -
вывода.
2) макроопределение типа данных FILE
3) макроопределение параметров используемых в вызовах библиотечных функций. Ряд библиотечных функций (функции для ввода-вывода символов getchar и putchar форматного ввода-вывода scanf, printf были рассмотрены ранее).
Рассмотрим неформатный ввод-вывод строк
Puts ( )
Функция puts помещает строку в выводной поток stdout, определение ее имеет вид:
Int puts (s)
char * s;
Функция puts записывает строку по указателю S в стандартный выводной поток stdout, строка S должна иметь ограничитель'\0'. Функция записывает поток всю строку за исключением символа \0 и добавляет в конец символ '\n', при обнаружении ошибки возвращается EOF
Gets ( )
Функция gets выводит строку из входного потока stdio.
Определение.
char * gets (s)
char * s;
Функция gets читает символы из вводного потока stdin в массив по указателю S до тех пор, пока не будет обнаружен символ новой строки '/n' или признак конца файлов. Символ / n отбрасывается, и строка завершается ограничителем / 0.
При обнаружении конца файла или ошибки возвращается NULL. Имеются функции файлового ввода-вывода (ранее рассмотренные). Функции форматного преобразования в памяти, функции преобразующие строку в число, функции для работы со строками, функции тестирования символов (регистр), функции для преобразования символов (верхние и нижние регистры), функции для динамического выделения памяти.
Putc().
Записывает символ в файл и имеет следующий прототип
int putc ( int c, FILE * lst);
Здесь lst - указатель на файл возвращаемый функции fopen, с-символ для записи (переменная имеет тип int, но используется только младший байт). При успешном завершении putc возвращает записанный символ, в противном случае возвращается const EOF, она определена в файле stdio.h, имеет значение – единица.
Getc().
Читает символ из файла и имеет следующий прототип (формат):
int getc (FILE * lst);
lst – это указатель на файл, возвращенный функцией fopen, эта функция возвращает прочитанный символ в соответствующее значение, определяется типом int по старший байт = 0. Если достигнут конец файла, то getc возвращает значение EOF.
Ferror().
Функция ferror позволяет проверить правильность выполнения последней операции при работе с файлами и имеет следующий прототип (формат):
int ferror ( FILE * lst);
В случае ошибки возвращается не нулевое значение, в противном случае возвращается 0.
Remove().
Функция remove удаляет файл и имеет следующий прототип
int remove ( char * file_name );
Здесь file_name – указатель на строку со спецификацией файла. При успешном завершении возвращается 0, в противном случае возвращается не нулевое значение.
Rewind().
Функция rewind устанавливает указатель текущей позиции в начало файла и имеет следующий формат
void rewind (FILE * lst );
Feof().
Определяет конец файла при чтении двоичных данных и имеет следующий прототип
int feof ( FILE * lst );
lst – это указатель на файл возвращенный функции fopen. При достижении конца файла возвращается не нулевое значение, в противном случае возвращается 0.
Препроцессор.
Основные сведения.
Транслятор Си имеет встроенное средство, расширяющее возможности языка и называемые препроцессором или макропроцессором.
Препроцессор позволяет осуществлять макрообработку, условную компиляцию, включать файлы, текст программы, управлять обработкой ошибок. Первым шагом компилятора является вызов препроцессора. Препроцессор работает подобно текстовому редактору под управлением директив препроцессора, которые кодируются в исходной программе так же, как обычные операторы Си, но препроцессорные директивы отличаются от обычных утверждений по форме. Они не следуют синтаксическим правилам для оператора. Для записи препроцессорных директив существуют свои правила.
Все препроцессорные директивы должны начинаться с символа #
Все препроцессорные директивы должны размещаться в первой колонке программы.
За # сразу же должно идти наименование директивы. В программах на Си используются следующие директивы препроцессора.
#include
#endif
#else
#define
#line
#undef
#fndef
#fdef
#if
#elif
#error и др.
В отличие от операторов в конце (;) не ставится. Директивы не являются операторами языка в традиционном смысле. После работы препроцессора директивы удаляются из текста программы. Директивы могут быть разделены на 3 категории: включение файлов, макроподстановка, управление компиляцией.
Включение файла.
Различные объектные модули могут объединяться с помощью редактора связи. Препроцессорная директива имеет вид:
#include<имя файла>
#include”имя файла”
Директива #include заменяется в тексте программы содержимым файла с заданным именем. Если заключена в <>, то искать файл в стандартном каталоге системы.
Понятие текущего и стандартного каталога, а также действия в случае не обнаружения файла определяются реализацией. Как правило, если файл не найден, то поиск продолжается в стандартных каталогах. Допускаются вложенные директивы #include.
Пример: следующие 2 директивы указывают компилятору на необходимость подключить заголовочный файл стандартной библиотеки ввода вывода:
#include<stdio.h>
#include”stdio.h”
Подключаемые файлы также могут иметь директивы #include. Если это имеет место, то говорят о вложенных подключениях.
Пример: данная программа подключает файл, который в свою очередь подключает др. файл.
/* файл программы*/
#include<stdio.h>
int main(void)
{
#include “one”
return 0;
}
/*подключение файла one/
printf(“это от 1-ого подключения файла \n”);
#include”two”
/*подключаемый файл two/
printf(“это от 2-ого подключаемого файла \n”);
Макроподстановка.
Простая.
Часто полезно иметь возможность указывать значения константы без явного её написания. Один из методов состоит в присвоении переменной некоторого значения с возможной дальнейшей ссылкой на него. Директива #define определяет идентификатор и последовательность символов, в которую будет помещаться данный идентификатор при его обнаружении в тексте программы идентификатор также называется именем макроса, а процесс замещения называется подстановкой макроса.
Формат простой макроподстановки:
#define идентификатор последовательность символов,
где идентификатор строится по правилам образования идентификатора в языке Си.
Конец идентификатора определяется по появлению первого символа пробела. Идентификатор в директиве #define иногда называют символической константой. После того, как директива #define обнаружена препроцессором, все последующие появления в тексте программы идентификатора заменяется соответствующей строкой за исключением тех случаев, когда идентификатор появляется внутри двойных или одинарных кавычек.
Пример: #define NULL 0
Идентификаторы, которые появляются в макроподстановке, рекомендуется записывать прописными буквами для того, чтобы указать, что они являются символическими константами.
Пример. См. выше
if(p= =NULL)
a=b;
printf(“\n NULL”);
Из приведенных 3 операторов только в первом процессор сделает подстановку, так как NULL не является символической константой, а запись \n NULL не доступна для препроцессора. В качестве строки, используемые в директиве #define может указываться любая конструкция, допустимая в Си. Строка размещается в директиве #define после второго пробела. Первый пробел указывается после директивы #define. Если за последним не пробельным символом в строке указывается \ это означает, что строка имеет продолжение на следующей линии.
Пример.
#define STR((a>b||c>b)&&)
((d%f)= =0))
main()
{ int a,b,c,d,f;
if(str)
оператор;
……..
}
Очень часто макросы используются для определения так называемых магических чисел, используемых в программе. Например, программа может определять массив и иметь несколько процедур для работы с ним. Вместо того чтобы жёстко кодировать размер массива лучше определить макрос, соответствующий размеру массива и использовать его в тех местах, где необходимо использование размера. Следовательно, если необходимо изменить размер массива единственное, что требуется сделать – изменить оператор #define и перекомпилировать программу. Везде, где использовался данный макрос, произойдут автоматические изменения.
Пример:
#define MAX_SIZE 100
/*……..*/
float balance[MAX_SIZE];
/*…….*/
float temp[MAX_SIZE];
Для изменения размеров обоих массивов необходимо изменить определение MAX_SIZE.
Дата добавления: 2016-04-14; просмотров: 733;