- •Функции.
- •Вызов функции с переменным числом параметров
- •Функция main и её параметры.
- •Директивы препроцессора (прекомпилера).
- •Объявление указателей.
- •Модификатор const.
- •Операции.
- •Указатели на различные типы.
- •Указатель на void.
- •Применение указателей для передачи данных между функциями.
- •Массивы.
- •Индексация массивов.
- •Хранение массива в памяти. Адреса элементов. Хранение массива в памяти.
- •Массивы и константные указатели.
- •Статическое и динамическое выделение памяти.
- •Функции calloc, malloc, free
- •Функция realloc
- •Передача массивов в качестве аргументов функции.
- •Указатели на функции.
- •Библиотеки функций.
- •Функции форматированного ввода-вывода.
- •Функция printf().
- •%[Флаги] [Ширина] [.Точность] [{h | l | I | i32 | i64}]тип
- •Для чего нужен форматированный вывод.
- •Функция scanf().
- •Функции sprintf() и sscanf().
- •Функции fprintf() и fscanf().
- •Функции неформатированного ввода-вывода.
- •Работа со строковыми данными (стрингами). Представление строковых данных в языке c.
- •Функции работы со строками.
- •Потоковый ввод-вывод
- •Функции форматированного ввода-вывода.
- •Функция printf().
- •%[Флаги] [Ширина] [.Точность] [{h | l | I | i32 | i64}]тип
- •Для чего нужен форматированный вывод.
- •Функция scanf().
- •Функции sprintf() и sscanf().
- •Функции fprintf() и fscanf().
- •Функции неформатированного ввода-вывода.
- •Функции работы с файлами.
- •Потоковый ввод-вывод
- •Работа с потоками
- •Курсор.
- •Ввод-вывод отдельных символов и строк.
- •Форматированный ввод-вывод информации в файл.
- •Блочный потоковый ввод-вывод
- •Смена текущей позиции в файле. Проверка конца файла.
- •Функции доступа к файлам нижнего уровня.
- •Методы сортировки данных.
- •Введение
- •Сравнение методов сортировки
- •Программная реализация алгоритмов сортировки
- •Метод пузырька.
- •Метод обмена.
- •Метод вставки.
- •Метод Шелла.
- •Метод кучи (бинарной кучи).
- •Очередь
- •Линейный список
- •Физическое (машинное) представление линейных списков
- •Программные реализации структур данных. Стек. Реализация в виде массива.
- •Стек. Связанное представление.
- •Очереди. Реализация в виде массива.
- •Дерево. Связанное представление.
- •Рекурсивный вызов функций.
- •Структуры. Объединения. Перечисления.
- •Перечисление (enum).
- •Производные типы данных.
- •Структура (struct).
- •Побитовое описание полей структуры.
- •Объявление переменных, реализующих структуру.
- •Доступ к элементам структуры.
- •Объединение (union).
- •Вложенное описание структур и объединений.
- •Описание структур и объединений в виде пользовательского типа.
- •Передача структур и объединений в виде параметров функции.
- •Инициализация структур и объединений.
- •Выгода от использования структур
Курсор.
Ввод-вывод очередного символа (или блока символов) происходит из позиции, где сейчас находится так называемый курсор. Курсор – это некоторый абстрактный указатель, показывающий текущую позицию в открытом файле, с которой работает программа. Позиция курсора (текущая позиция в файле) – это номер символа (от начала файла), с которого начнётся чтение/запись при следующем обращении к файлу
При чтении символа или блока символов курсор сдвигается на количество прочитанных символов вперёд, после чего он начинает показывать на символ, с которого начнётся чтение при следующем обращении к файлу. Аналогичные процессы происходят и при записи.
При открытии файла на чтение ("r") или запись ("w") курсор устанавливается на начало файла. При открытие файла на добавление ("a") он устанавливается на конец файла. Курсор может позиционироваться вручную (это описано ниже), но не может быть установлен раньше начала файла, или дальше текущей длины файла (хотя может быть установлен в самый конец файла).
Ввод-вывод отдельных символов и строк.
Одним из наиболее эффективных способов осуществления ввода-вывода одного символа является использование библиотечных функций getc() и putc(). Они имеют следующие прототипы:
int getc (FILE *stream);
int putc (int c, FILE *stream); где
с – выводимый символ,
stream – поток, в который выводится символ.
Функция getc() берёт один символ из потока (файла) и возвращает его код в случае успешного заверщения. Функция putc() записывает в поток (файл) символ с заданным кодом и возвращает код этого символа в случае успешного завершения. Обе функции возвращают константу EOF в случае ошибки.
Существуют также "двойники" этих функций fgetc() и fputc(), имеющие те же самые аргументы и выполняющие те же самые действия. Различие состоит в реализации – fgetc() и fputc() реализованы как функции, а getc() и putc() - как макросы.
Для ввода-вывода строк из файла существуют следующие функции:
char *fgets( char *string, int n, FILE *stream );
int fputs( const char *string, FILE *stream ); где
string – буфер, хранящий строку для вывода или резервирующий место для ввода строки.
n – максимальное количество вводимых символов.
stream – указатель на идентификатор потока.
Функция fgets() читает из определенного указателем stream файла не более (n-1) символов и записывает их в строку, на которую указывает s. Функция прекращает чтение, как только прочтет (n-1) символов или встретит символ новой строки '\n', который переносится в строку s. Она возвращает указатель на введённую строку в случае успешного завершения или NULL в противном случае.
Функция fputs() записывает ограниченную символом '\0' строку в поток, на который указывает stream, и возвращает неотрицательное значение (обычно 0) в случае успешного завершения или значение константы EOF в случае ошибки. Символ '\0' в файл не переносится, и символ '\n' не записывается в конце строки вместо '\0'.
Форматированный ввод-вывод информации в файл.
Во многих случаях информацию удобно выводить в файл в форматированном виде, т.е. записывать какие-либо значения в символьном виде по заранее заданному формату. Для этого существуют функции fprintf() и fscanf(), работающие полностью аналогично функциям printf() и scanf(), но работающие с потоком ввода-вывода в файл. Функция fscanf считывает информацию из файл по заданному формату, а функция fprintf() выводит форматированную информацию в файл. Эти функции имеют следующие прототипы:
int fprintf (FILE* stream, const char* FormatString, [arg1, arg2,]…);
int fscanf(FILE* stream, const char* FormatString, [void* arg1, void* arg2,]…);
Работа этих функций полностью аналогична функциям printf() и scanf() (рассмотренным выше), но в качестве дополнительного параметра в них сообщается указтель на идентификатор потока, с которым надо обменяться данными.
Вот пример, иллюстрирующий обращение ко всем вышеперчисленным функциям:
#include (stdio.h)
main( )
{
FILE *fi;
int age;
char ac[255];
char c;
if((fi=fopen("sam”, "r")) // Открываем на чтение
{
fscanf( fi, " %d" , &age); // Читаем информацию
c=getc(fi);
fgets(ac,254,fi);
fclose(fi);
if(fi = fopen(“data" , "a"); // Открываем на добавление
{
fprintf( fi, "sam is %d.\n" , age); // Добавляем
// информацию
putc(c,fi);
fputs(ac,fi);
fclose(fi);
}
)