Лекция 9. Файлы - структурированный тип данных. Введение
Действительно, с одной стороны файлы это структурированный тип данных, потому что используя идентификатор переменной файлового типа мы получаем доступ к файлу - совокупности данных НЕОГРАНИЧЕННОГО (в принципе) объема. Объем файла ограничен только физическим объемом диска. С другой стороны, файл обычно ХРАНИТСЯ на каком-то физическом носителе (диск HDD, дискета, ZIP-устройство и т д). Но используя WinAPI можно отобразить файл на оперативную память, то есть хранение на внешнем устройстве - не обязательный признак файла. Файл имеет имя и может иметь расширение.
Записи файла.
Удобно представлять себе файл как последовательность (цепочку) ЗАПИСЕЙ, причем запись может иметь любой тип данных (кроме файла). То есть могут быть файлы вещественых чисел (например, типа double - каждая запись - число занимает 8 байт); могут быть файлы для хранения анкет, где каждая запись имеет тип STROKA (см лекцию 6 - начало) и занимает 27 байт. (Чтобы это было действительно так, нужно описание PACKED RECORD ..., иначе компилятор выровняет начало данных на границу слова). Файл может состоять из записей-массивов - например, типа array[1..100] of double (каждая запись - 800 байт). Длина файла и позиция файлового указателя возвращается функциями Паскаля в ЗАПИСЯХ. Отметим, что тип данных ЗАПИСЬ и ЗАПИСЬ файла - вообще говоря, вещи разные, но в частности, конечно запись файла может вмещать в себя все поля некоторой записи как типа данных. брр...
Файловый указатель
Работая с файлом полезно помнить о существовании ФАЙЛОВОГО указателя. Он всегда указывает на начало записи. При записи и чтении - после записи/чтения очередной записи файловый указатель прыгает на начало следующей. Выполнение команды записи/чтения заключается в записывании/чтении той записи (одной), на которую указывает указатель. Поэтому обычно чтение/запись заключается в циклическом повторении команды записи/чтения.
Любой файл можно рассматривать, как файл с однобайтовыми записями и соответственно его обрабатывать. Это - универсальный подход, но не всегда удобный, птому что мало прочесть несколько байт - нужно их еще декодировать, чтобы получить, например, число типа double из цепочки 8 байт. А если Вы объявили file of double, то результат чтения очередной записи Вы просто помещаете в переменную типа double (или элемент массива array [] of double).
Основные операции с файлом: чтение, запись, создание, переименование, удаление.
Типы файлов Турбо Паскаля
Кроме рассмотренных выше типизированных файлов (то есть структурно файл состоит из записей объявленного в описании типа) существуют еще:
- Текстовые файлы. У них нет постоянной длины записи. Текстовые данные записываются/читаются порциями - строками, где разделителем служит перевод строки
(в MSDOS и Windows - это пара символов #13#10)
- Нетипизированные файлы. Чтение и запись производится процедурами BlockRead/BlockWrite - соответственно, причем размер записи указывается в описании.
Этот способ самый быстрый из трех (текстовые, типизированные, нетипизированные), потому что не тратится время на кодирование/декодирование данных.
Прямой и последовательный доступ к файлу.
Прямой доступ означает, что файловый указатель можно (принудительно) поставить на любую позицию, следовательно получить произвользный порядок чтения данных. И это может быть удобно программисту. Например, если в файле хранится матрица системы линейных уравнений, то по ходу вычислений нужно обращаться к вполне определенному элементу матрицы, не по порядку.
Если доступ - последовательный, то записи прочитываются/записываются по-порядку, последовательно. Последовательный доступ характерен для медленных устройств, напрмер, данные на ленте (стриммер). Это существенно для программиста: методы сортировки данных отличаются для файлов прямого и последовательного доступа.
[ см учебник [1]: 6.2.Сортировка последовательных файлов.]
Конечно, последовательный доступ к файлам, расположенным на HDD быстрее, чем доступ в нужном алгоритму порядке. Поэтому для достижения максимальной скорости нужно учитывать физическую структуру и характеристики диска.