- •Списки §1. Общие сведения о списках
- •§2. Создание списка
- •§3. Просмотр и анализ списка
- •3.1. Просмотр и анализ списка целых чисел.
- •3.2. Просмотр и анализ списка одномерных массивов.
- •§6. Сравнительный анализ списков.
- •§1. Порядок работы с файлом
- •1.1. Потоки и файлы
- •1.2. Объявление файла
- •1.3. Открытие файла.
- •1.4. Закрытие файла.
- •§2. Работа с текстовым файлом
- •2.1. Посимвольная работа с текстовым файлом
- •Int fputc(int ch, file *stream)
- •2.2. Построчная работа с текстовым файлом
- •§3. Функции блокового ввода/вывода
- •3.1. Экономические задачи с использованием файлов
- •3.2. Математические задачи с использованием файлов
- •§4. Прямой (произвольный) доступ к файлу
- •4.1. Функция fseek()
- •4.2. Замена записи. Функции ftell, fgetpos, fsetpos, rewind.
- •Пример. В файл записать координаты точек плоскости. Найти две (любые) точки с наибольшим расстоянием между ними. Массив для хранения координат всех точек не использовать.
- •Упражнения, тесты.
- •Функции (дополнительные возможности)
- •§1. Функции с переменным количеством параметров.
- •§2. Указатели на функции.
- •§3. Массив указателей на функции.
- •§4. Введение в рекурсивные функции.
- •Упражнения, тесты.
- •Void Fun1 (float); void Fun2(float); void Fun3(float);
- •Лабораторная работа № 12.
- •Команды препроцессора (директивы компиляции)
- •§1. Директива define (замены в тексте)
- •Простое макроопределение (макрос)
- •Макрос с аргументами.
- •Директива #undef.
- •§2. Директива #include (включение файлов).
- •§3. Директивы условной компиляции.
- •Директива #if.
- •Директивы #ifdef и #ifndef.
- •Упражнения, тесты
- •История развития технологий программирования
- •§1. Программирование в машинных кодах и на языках символического кодирования
- •§2. Языки высокого уровня. Структурное и модульное программирование
- •§3. Интегрированные системы программирования.
- •§4. История и идеи объектно-ориентированного программирования.
- •§5. Программирование для Windows. Визуальное программирование.
- •Литература
- •Оглавление Предисловие………………………………………………………….…………………3
- •Г л а в а 4. Структуры и другие типы, определяемые пользователем.84
- •Г л а в а 6. Файлы ………………………………………………………..154
- •Г л а в а 7. Функции (дополнительные возможности) ………………190
- •Г л а в а 9. История развития технологий программирования ……220
§1. Порядок работы с файлом
1.1. Потоки и файлы
Фундаментом понимания системы ввода-вывода C (и С++) является концепция потоков и файлов.
Система ввода-вывода предоставляет уровень абстракции между программистом и аппаратными средствами, которая связана с понятием потока. Каждое из устройств (терминал, дисковые накопители и др.) имеет свои особенности, но система преобразует их в единое логическое абстрактное устройство, называемое потоком. Потоки похожи своим поведением и не зависят от устройств. Другими словами, одни и те же или похожие функции можно использовать для записи информации как на диск, так и на другое устройство. Таким образом, для пользователя поток — это либо файл на диске, либо физическое устройство (например, дисплей или принтер). Поэтому когда пользователь выполняет операции ввода-вывода для потока, то имеется ввиду, что он работает либо с файлом, либо с каким-нибудь устройством.
Файлы — это логическая концепция, которая применима к любому устройству (дисковые файлы, терминал и др.). Не все файлы имеют одинаковые возможности. Например, дисковый файл поддерживает произвольный доступ, а модем — нет. Поэтому можно сказать, что потоки одинаковы, а файлы разные.
Есть два типа потоков: текстовые и двоичные.
Текстовые потоки представляют собой последовательность символов, часть из которых могут преобразовываться. Например, при выводе символ новой строки может преобразовываться в два символа: “возврат каретки” и “перевод строки”. А при вводе выполняется обратное преобразование. Отсюда следует, что может не быть однозначного соответствия между записываемыми или считываемыми символами и символами во внешнем устройстве. Кроме этого, количество прочитанных или записанных символов может не совпадать с количеством символов во внешнем устройстве.
Двоичные потоки — последовательность байт, имеющих однозначное соответствие с байтами во внешнем устройстве. Никакого преобразования символов не выполняется. Поэтому количество прочитанных (записанных) байт в точности совпадает с количеством байт во внешнем устройстве.
Тип потока указывается при открытии файла с помощью буквы t или b во втором параметре функции fopen (см. 1.3).
1.2. Объявление файла
В С нет специального типа и встроенных средств ввода-вывода при работе с файлами, как это было, например, в языке Pascal. Рассмотрим, что означает следующее, например, объявление: FILE * fp. Можно подумать, что это объявлен указатель на область памяти, в которой находится информация файла. Но, во-первых, файл всегда связан с внешним устройством, то есть информация файла всегда находится во внешней памяти. С другой стороны, значением указателя является адрес ячейки, находящейся в оперативной памяти. Получается противоречие. Тогда что же мы таким образом объявили?
Так объявлен указатель на область оперативной (а не внешней) памяти, которую называют блок управления файлом. В этой памяти хранятся не данные из файла, а информация о нём, то есть характеристики файла в виде структуры с именем FILE. Таким образом, объявлен указатель на стандартную структуру. Её поля представляют собой параметры файла, часть из которых следующие:
физическое имя файла по правилам операционной системы (см. 1.3);
состояние файла, например, открыт для чтения (см. 1.3);
положение так называемого “невидимого курсора”, или указателя (индикатора) позиции файла. Открытие файла устанавливает его на начало файла. По мере чтения или записи он продвигается по файлу. Например, после чтения определённой порции информации этот “курсор” перемещается и позицианируется там, откуда будет читаться следующая порция данных;
указатель на буфер, связанный с файлом. Дело в том, что при обмене данными с внешним устройством происходит так называемая буферизация данных. Информация не сразу, например, записывается в файл. Сначала некоторая порция информации сохраняется в промежуточной оперативной памяти, которая называется буфер ввода-вывода. И только после того, как там накопится определённый объём информации (целый сектор), этот буфер очищается и данные физически записываются в файл. Таким образом экономится время, затрачиваемое на обмен данными с внешним устройством. Это можно частично сравнить с доставкой пассажиров в аэропорту к самолёту;
тип доступа.