
- •Общие методические указания по выполнению лабораторных работ
- •Работа со структурами данных (struct)
- •Описание структур и структурных переменных
- •Вложенные структуры
- •Обращение к полям структуры
- •Например, для переменных, описанных шаблоном
- •Массивы структурных переменных
- •Объявление типов в языке Си
- •Введите оценки ( 2 целых числа от 3 до 5 ): 5 5
- •Использование структур в функциях
- •Использование глобальных данных
- •Обработка вложенных структур
- •Толстой л.Н. Война и мир 1995 6 Структуры и поразрядные операции
- •Поразрядные операции
- •Сдвиговые поразрядные операции
- •Операнд сдвиг число_битов
- •Структуры с битовыми полями
- •Работа с объединениями (union)
- •Работа с перечислениями (enum)
- •Работа с файлами Понятие файла и потока ввода-вывода данных в компьютере
- •Открытие и закрытие файла
- •Потоки стандартного ввода-вывода
- •Повторное открытие файла
- •Позиционирование указателя записи-чтения
- •Int fseek (указатель_потока, (long) смещение, начало_отсчета),
- •Начало_отсчета может принимать следующие значения:
- •Функции файлового ввода-вывода
- •Посимвольный ввод-вывод
- •Вывод символов из файла:
- •Построчный ввод-вывод Пусть описан символьный массив
- •Форматированный ввод-вывод данных
- •Блоковый ввод-вывод
- •Работа с динамическими структурами данных Динамическое распределение памяти
- •Очередь
- •Рекурсивные функции
- •Деревья
Потоки стандартного ввода-вывода
Каждая Си-программа при исполнении получает уже открытыми пять файлов стандартного ввода-вывода, указатели-константы на которые в виде символических имен стандартных потоков (устройств ввода-вывода) определены в файле stdio.h:
stdin – указатель на входной буфер при вводе с клавиатуры (устройство CON – консоль);
stdout – указатель на выходной буфер при выводе на экран консоли;
stderr – указатель для вывода сообщений на экран консоли ;
stdaux – указатель для связи с дополнительным устройством (AUX, COM1);
stdprn – указатель для вывода на устройство печати (PRN).
Файл stdin открывается для программы только для чтения, файлы stdout, stderr, stdprn – только для записи, файл stdaux – для чтения и записи. Указатели стандартных потоков могут использоваться так же, как указатели на переменную типа FILE для потоков, открытых программистом в программе. Они же используются по умолчанию в стандартных функциях ввода с клавиатуры и вывода на экран.
В файле заголовков stdio.h заданы также константы, используемые при работе с файлами:
NULL – нулевой байт, возвращаемый как NULL-указатель в случае ошибки при открытии файла;
EOF – значение конца файла (–1).
Повторное открытие файла
Закрытый файл можно открыть заново с другим типом доступа. Открытый файл можно повторно открыть и изменить права доступа одной функцией
вида
freopen (“имя_файла“, ”тип_доступа”, указатель_потока) ,
которая закрывает файл, на который ссылается указатель_потока, а затем открывает файл, на спецификацию которого указывает ASCIIZ-строка имя_файла, с новым типом_доступа. В случае успеха функция возвращает указатель на открытый поток, который будет совпадать с указателем_потока, иначе возвращает NULL.
Повторное открытие того же самого файла изменяет права доступа, очищает внутренние буферы и позиционирует указатель записи-чтения либо на начало (r, w, r+, w+), либо на конец (a, a+) файла. Например, в рассмотренном выше примере открытия файла myfile функция
freopen (path, “r”, myfile);
повторно откроет файл с именем, заданным в строке с указателем path, и на который ссылается указатель myfile, с режимом доступа только для чтения.
Если файлы разные, повторное открытие приводит к переадресации потока ввода-вывода. Например, строка программы
freopen (“c:\\file1.tmp ”, “w”, stdout);
выполняет переадресацию стандартного вывода во временный файл c:\file1.tmp.
Позиционирование указателя записи-чтения
С каждым файлом связан указатель записи-чтения (маркер), задающий место доступа к очередному байту файла. При выполнении последовательного доступа маркер позиционируется (смещается) автоматически при любой операции чтения или записи. Если после ввода информации в файл требуется её прочитать с самого начала, необходимо прежде всего использовать функцию вида
rewind (fp) , где fp – указатель на открытый файл.
Эта функция устанавливает маркер записи-чтения на начало файла. Файл можно обрабатывать в любом порядке, если передвинуть маркер в нужную позицию функцией вида
Int fseek (указатель_потока, (long) смещение, начало_отсчета),
которая сдвигает маркер записи-чтения файла, на который ссылается указатель_потока, на величину смещения от начала_отсчета. При этом если смещение > 0, то выполняется сдвиг к концу файла, а если смещение < 0 – к началу файла.