Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцииЛаб(Часть_2_Книги).doc
Скачиваний:
4
Добавлен:
03.05.2019
Размер:
988.16 Кб
Скачать

§1. Порядок работы с файлом

1.1. Потоки и файлы

Фундаментом понимания системы ввода-вывода C (и С++) является концепция потоков и файлов.

Система ввода-вывода предоставляет уровень абстракции между программистом и аппаратными средствами, которая связана с понятием потока. Каждое из устройств (терминал, дисковые накопители и др.) имеет свои особенности, но система преобразует их в единое логическое абстрактное устройство, называемое потоком. Потоки похожи своим поведением и не зависят от устройств. Другими словами, одни и те же или похожие функции можно использовать для записи информации как на диск, так и на другое устройство. Таким образом, для пользователя поток — это либо файл на диске, либо физическое устройство (например, дисплей или принтер). Поэтому когда пользователь выполняет операции ввода-вывода для потока, то имеется ввиду, что он работает либо с файлом, либо с каким-нибудь устройством.

Файлы — это логическая концепция, которая применима к любому устройству (дисковые файлы, терминал и др.). Не все файлы имеют одинаковые возможности. Например, дисковый файл поддерживает произвольный доступ, а модем — нет. Поэтому можно сказать, что потоки одинаковы, а файлы разные.

Есть два типа потоков: текстовые и двоичные.

Текстовые потоки представляют собой последовательность символов, часть из которых могут преобразовываться. Например, при выводе символ новой строки может преобразовываться в два символа: “возврат каретки” и “перевод строки”. А при вводе выполняется обратное преобразование. Отсюда следует, что может не быть однозначного соответствия между записываемыми или считываемыми символами и символами во внешнем устройстве. Кроме этого, количество прочитанных или записанных символов может не совпадать с количеством символов во внешнем устройстве.

Двоичные потоки — последовательность байт, имеющих однозначное соответствие с байтами во внешнем устройстве. Никакого преобразования символов не выполняется. Поэтому количество прочитанных (записанных) байт в точности совпадает с количеством байт во внешнем устройстве.

Тип потока указывается при открытии файла с помощью буквы t или b во втором параметре функции fopen (см. 1.3).

1.2. Объявление файла

В С нет специального типа и встроенных средств ввода-вывода при работе с файлами, как это было, например, в языке Pascal. Рассмотрим, что означает следующее, например, объявление: FILE * fp. Можно подумать, что это объявлен указатель на область памяти, в которой находится информация файла. Но, во-первых, файл всегда связан с внешним устройством, то есть информация файла всегда находится во внешней памяти. С другой стороны, значением указателя является адрес ячейки, находящейся в оперативной памяти. Получается противоречие. Тогда что же мы таким образом объявили?

Так объявлен указатель на область оперативной (а не внешней) памяти, которую называют блок управления файлом. В этой памяти хранятся не данные из файла, а информация о нём, то есть характеристики файла в виде структуры с именем FILE. Таким образом, объявлен указатель на стандартную структуру. Её поля представляют собой параметры файла, часть из которых следующие:

физическое имя файла по правилам операционной системы (см. 1.3);

состояние файла, например, открыт для чтения (см. 1.3);

положение так называемого “невидимого курсора”, или указателя (индикатора) позиции файла. Открытие файла устанавливает его на начало файла. По мере чтения или записи он продвигается по файлу. Например, после чтения определённой порции информации этот “курсор” перемещается и позицианируется там, откуда будет читаться следующая порция данных;

указатель на буфер, связанный с файлом. Дело в том, что при обмене данными с внешним устройством происходит так называемая буферизация данных. Информация не сразу, например, записывается в файл. Сначала некоторая порция информации сохраняется в промежуточной оперативной памяти, которая называется буфер ввода-вывода. И только после того, как там накопится определённый объём информации (целый сектор), этот буфер очищается и данные физически записываются в файл. Таким образом экономится время, затрачиваемое на обмен данными с внешним устройством. Это можно частично сравнить с доставкой пассажиров в аэропорту к самолёту;

тип доступа.