
- •Основы алгоритмизации и программирования, язык Си
- •Введение
- •Блок-схема алгоритма Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Описание переменных
- •Локальные переменные
- •Операции и выражения
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора Директива #include
- •Директива #define
- •Понятие пустого и составного операторов
- •Условные операторы
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Операторы перехода (break, continue, return, goto)
- •Примеры программ
- •Массивы Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Параметры по умолчанию
- •Передача массива в функцию
- •Inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Доступ к элементам структуры
- •Инициализация структур
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Примеры программ
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Потоки и файлы
- •Файлы Основные сведения о файловой системе
- •Организация посимвольного ввода и вывода
- •Определение конца файла feof()
- •Организация ввода и вывода строк
- •Удаление файлов
- •Дозапись потока
- •Позиционирование в файле
- •Текстовые и двоичные файлы
- •Функции fread() и fwrite()
- •Примеры программ
- •Хеширование
- •Схемы хеширования
- •Метод открытой адресации с линейным опробыванием
- •Метод цепочек
- •Машинное представление графов
- •Примеры программ
- •Литература
Функции fread() и fwrite()
Для чтения и записи, блоками данных любого типа, в файловой системе языка С имеется две функции: fread() и fwrite(). Прототипы этих функций имеют соответственно следующий вид:
size_t fread(void *buf, size_t size, size_t count, FILE *stream);
size_t fwrite(const void *buf, size_t size, size_t count, FILE *stream);
где buf — это указатель на область памяти, в которую будут прочитаны данные из файла (fread()), или указатель на данные, которые будут записаны в файл (fwrite()). Значение count определяет, сколько считывается или записывается элементов данных, причем длина каждого элемента в байтах равна size, stream — это указатель на файл.
Функция fread() возвращает количество прочитанных элементов. Если достигнут конец файла или произошла ошибка, то возвращаемое значение может быть меньше, чем count. А функция fwrite() возвращает количество записанных элементов. Если ошибка не произошла, то возвращаемый результат будет равен значению count.
Наряду с доступом к информации в файле используя указатель типа FILE* может быть использован подход, основанный на использовании дескриптора (номера) файла. Дескриптор файла имеет тип int. Всякий раз, когда осуществляется ввод/вывод, идентификация файла осуществляется по его номеру. Для обеспечения возможности работы с файлами, как и в предыдущем случае, файл должен быть открыт. Для этого имеется две функции: open и creat.
int open(const char *name, int flags, unsigned mode).
Функция open() открывает файл с именем name и устанавливает режим доступа к нему в соответствии со значением аргумента flags. Аргумент flags представляет собой комбинацию основного режима доступа и модификаторов.
O_RDONLY - открыть только для чтения;
O_WRONLY - открыть только для записи;
O_RDRW - открыть для записи/чтения;
Выбрав одно из значений основного режима, можно объединить его, используя операцию | (ИЛИ) с одним или большим числом модификаторов:
O_NDELAY - не используется, включен для совместимости с UNIX:
O_APPEND - перемещает указатель в конец файла перед очередной записью:
O_CREAT - если файл не существует, то создает его в соответствии с mode;
O_TRUNC - существующий файл урезает до 0, сохраняя его атрибуты:
O_EXCL - при использовании с O_GREAT не будет создаваться выходной файл если файл с таким именем уже существует;
O_BINARY - открывается двоичный файл;
O_TEXT - открывается текстовый файл.
Аргумент mode требуется только при использовании модификатора O_CREAT и принимает одно из следующих трех значений:
S_IWRITE доступ по записи;
S_IREAD доступ по чтению;
S_IWRITE|S_IREAD доступ по записи /чтению.
Функция возвращает либо дескриптор открытого файла, либо –1 в случае ошибки, при этом errno принимает одно из четырех значений:
ENOENT файл не существует;
EMFILE слишком много открытых файлов;
EACCESS доступ запрещен;
EINVACC недействительный код доступа.
Пример открытия файла с использованием функции open():
int fd;
if ((fd=open(filename,O_WRONLY)==-1)
{ printf(”ошибка открытия файла\n”);
exit(1);
}
Функция close() разрывает связь между файловым дескриптором и открытым файлом. При этом файл закрывается, а дескриптор освобождается для его использования с другим файлом. Она аналогична функции fclose() с той разницей, что не приводит к выталкиванию содержимого буфера в файл. Завершение программы при помощи exit() или return в функции main() закрывает все открытые файлы.