- •Функции.
- •Вызов функции с переменным числом параметров
- •Функция 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).
- •Вложенное описание структур и объединений.
- •Описание структур и объединений в виде пользовательского типа.
- •Передача структур и объединений в виде параметров функции.
- •Инициализация структур и объединений.
- •Выгода от использования структур
Функции fprintf() и fscanf().
Функции fprintf() и fscanf() полностью аналогичны функциям printf() и scanf(), но используются для форматированного ввода-вывода при работе с файлами. Дополнительный параметр stream идентифицирует сессию работы с файлом (об этом ниже):
int fprintf (FILE* stream, const char* FormatString, [arg1, arg2,]…);
int fscanf(FILE* stream, const char* FormatString, [void* arg1, void* arg2,]…);
Функции неформатированного ввода-вывода.
char *gets( char *buffer );
Ввод строки с клавиатуры. Вводимая строка должна заканчиаться символом перевода строки (нажатием клавиши Enter), который функция gets() заменяет на терминирующий ноль.
int getch( void );
Ввод 1 символа с клавиатуры. Функция ожидает нажатие любой клавиши и возвращает ASCII-код введённого символа. Если была нажата спецклавиша (функциональная клавиша, стрелка и т.п.), то getch вернёт 0, это означает, что нужно ещё раз вызвать эту функцию для получения кода, описывающего нажатую клавишу.
int getchar( void );
Эквивалент getch()
int puts( const char *string );
Вывод строки на экран.
int putch( int c );
Вывод символа на экран.
int putchar( int c );
Эквивалент putch().
char *fgets( char *string, int n, FILE *stream );
Аналогично gets(), но работает с файлами.
int getc( FILE *stream );
Аналогично getch(), но работает с файлами.
int fgetc( FILE *stream );
Эквивалент getc();
int fputs( const char *string, FILE *stream );
Аналогично puts(), но работает с файлами.
int putc( int c, FILE *stream );
Аналогично putch(), но работает с файлами.
int fputc( int c, FILE *stream );
Эквивалент putc();
Все вышеперечисленные функции объявлены в stdio.h, за исключением getch() и putch(), описанных в conio.h.
Работа с файлами. Функции стандартной библиотеки по работе с файлами. Режимы работы с файлами.
Функции работы с файлами.
Библиотека языка С поддерживает 3 уровня ввода-вывода:
Потоковый ввод-вывод.
Ввод-вывод нижнего уровня.
Прямой аппаратный ввод-вывод (самый нижний уровень, системно зависимый, например работа с портами процессора).
В данном курсе мы будем рассматривать только первые 2 уровня, причём наибольшее внимание уделим потоковому вводу-выводу. Функции ввода-вывода нижнего уровня похожи на функции потокового ввода-вывода, но покрывают только часть функциональности, правда, при этом работают быстрее (что можно заметить только при работе с очень большими объёмами данных).
Прямой аппаратный ввод-вывод мы рассматривать не будем, т.к. он очень сильно системно зависим. В настоящее время он используется в основном во встроенных системах, и для полного понимания его работы необходимо рассматривать принципиальную электрическую схему конкретной аппаратной платформы или аналогичный ей документ.
Потоковый ввод-вывод
Строго говоря, к функциям потокового ввода-вывода относятся как функции работы с файлами, рассматриваемые в этом разделе, так и функции вывода на монитор и считывания данных с клавиатуры, рассмотренные в предыдущем разделе.
На уровне потокового ввода-вывода обмен данными производится побайтно. Такой ввод-вывод возможен как для собственно устройств побайтового обмена (печатающее устройство, дисплей), так и для файлов на диске. Хотя устройства внешней памяти, строго говоря, являются устройствами поблочного обмена, т.е. за одно обращение к устройству производится считывание или запись фиксированной порции данных, операционная система и драйвер устройства имитируют побайтовый обмен.
При вводе с диска (при чтении из файла) данные помещаются в буфер операционной системы блоками, а затем побайтно или определенными порциями передаются программе пользователя. При выводе данных в файл они накапливаются в буфере, а при заполнении буфера записываются в виде единого блока на диск за одно обращение к последнему.
Функции библиотеки ввода-вывода языка C, поддерживающие обмен данными с файлами на уровне потока, позволяют обрабатывать данные различных размеров и форматов, обеспечивая при этом буферизованный ввод и вывод. Таким образом, поток - это файл вместе с предоставляемыми средствами буферизации.
При работе с потоком можно производить следующие действия:
открывать и закрывать потоки (связывать указатели на потоки с конкретными файлами);
вводить и выводить: символ, строку, форматированные данные, порцию данных произвольной длины;
анализировать ошибки потокового ввода-вывода и условие достижения конца потока (конца файла);
управлять буферизацией потока и размером буфера;
получать и устанавливать указатель (индикатор) текущей позиции в потоке.
Для того чтобы можно было использовать функции библиотеки ввода-вывода языка Си, в программу необходимо включить заголовочный файл stdio.h (#include <stdio.h>), который содержит прототипы функций ввода-вывода, а также определения констант, типов и структур, необходимых для работы функций обмена с потоком.