Автор работы: Пользователь скрыл имя, 26 Апреля 2012 в 21:22, курсовая работа
За время существования профессии программиста сущность его труда изменилась коренным образом. В 50-х годах программы писали в командах ЭВМ (в “машинных кодах”). При этом вся информация переводилась в двоичную систему счисления. Это очень тяжелый и напряженный труд, требующий от человека особой аккуратности. Облегченно вздохнули программисты при появлении в 1956 г. специального языка для решения вычислительных задач. Это был FORTRAN (Formula Translator). С тех пор были разработаны другие, более совершенные языки, или специализированные применительно к какой-то конкретной области: КОБОЛ, АЛГОЛ, ПЛ/1, ЛИСП, СИМУЛА, ПАСКАЛЬ, СИ, АДА, ПРОЛОГ и др.
Для
всех рассмотренных ранее
Однако во многих задачах количество компонент заранее определить невозможно (даже если они одного и того же из известных нам типов), так как это количество выясняется только в процессе выполнения программы. Этому требованию отвечает файловый тип данных.
Файл – это последовательность компонент одного и того же типа, причем количество компонент в файле заранее не оговаривается, компоненты файла не имеют индексов. До некоторой компоненты можно “добраться”, только перебрав все предыдущие. Вспомним задачу сортировки. Карточки лежат стопкой на столе, открыта только верхняя. Слово “файл” в переводе означает “картотека”, “подшивка”.
Условно файл можно изобразить как некоторую ленту, у которой есть начало, а конец не фиксируется. Элементы файла записываются на ленту последовательно друг за другом:
f
Здесь f – имя файла, f1 , f2 , f3 , …– его элементы. Файл во многом напоминает магнитную ленту, начало которой заполнено записями песен, а конец свободен. Новую песню можно поместить только после последней. Аналогично новые элементы файла могут быть записаны только в его конец.
В программировании существует несколько разновидностей файлов, отличающихся способом доступа к компонентам файла. Мы рассмотрим простейший из способов доступа, состоящий в том, что по файлу можно двигаться только последовательно, начиная с первого элемента. Т.е. чтобы дойти, например, до пятого элемента файла, необходимо, начав с первого элемента, пройти через предыдущие четыре. Такие файлы называются файлами последовательного доступа или последовательными файлами. У последовательного файла доступен всегда лишь очередной его элемент. Если в ходе выполнения программы необходим какой-либо из предыдущих элементов, то нужно вернуться в начало файла и последовательно пройти все его элементы до нужного.
Файловый тип в Паскале – это единственный тип значений, посредством которого данные, обрабатываемые программой, могут быть получены извне, а результаты могут быть переданы во внешний мир. Это единственный тип значений, который связывает программу с внешними устройствами ЭВМ.
Длиной файла называется число записанных в нем компонент. Файл с нулевой длиной (не содержащий компонент) называют пустым.
Файловый тип данных описывается в программе на Паскале следующим образом:
TYPE <имя типа> = FILE OF < тип компонент>;
<имя типа> - произвольный идентификатор,
< тип компонент> - любой тип Паскаля, кроме файлового, а также
кроме типа, содержащего в себе файловый тип.
Переменные файлового типа описываются обычным образом. Например:
1. TYPE N = FILE OF REAL;
VAR F : N;
2. TYPE TEX = FILE OF SET OF CHAR;
VAR I, O : TEX;
3. TYPE morze = (point, dash);
TYPE informat = FILE OF morze;
VAR telegram : informat;
В
Турбо Паскале можно
TYPE untyp = FILE;
Файловый тип может быть непосредственно задан при описании переменных в разделе переменных:
VAR letter : FILE OF CHAR;
Каждый тип данных в Паскале определяет некоторое допустимое множество значений и множество операций над ними. Над значениями файлового типа в стандарте языка Паскаль не определены никакие операции, в том числе операции присваивания или сравнения. Все операции можно производить только с компонентами (элементами) файла. Поэтому множество операций определяется типом компонент.
Для
доступа к отдельным
Процедура REWRITE (f) устанавливает
файл с именем f в начальное состояние
режима записи, т.е. окно устанавливается
на первую позицию файла, и файл переходит
в режим записи. Если в файле были записаны
ранее какие-либо элементы, то они становятся
недоступными:
f
Процедура WRITE (f, x) записывает в файл с именем f (в ту позицию, на которую указывает окно) очередную компоненту, равную значению выражения x, после чего окно сдвигается на следующую позицию файла. При этом тип выражения x должен совпадать с типом компонент файла f.
f f
Состояние файла f до Состояние файла f после
выполнения
процедуры выполнения процедуры
С помощью этих двух процедур осуществляется запись компонент в файл. Процедуру REWRITE (f) можно применять к одному и тому же файлу сколько угодно раз.
Процедура RESET (f) переводит файл
f в режим чтения и устанавливает окно
для чтения в первую позицию файла:
f
Процедура READ (f, v) присваивает переменной v значение текущей компоненты файла f (той, на которую указывает окно) и передвигает окно на следующую позицию файла. Т.е. считывает одну компоненту.
f v
Состояние
файла f и переменной v
до выполнения процедуры
f v
Состояние
файла f и переменной v
после выполнения процедуры
Чтение с помощью процедуры READ (f,v) можно производить только после выполнения RESET (f), т.е. после установки файла в режим чтения.
Замечание. Работа с каждым файлом может происходить либо только в режиме записи, либо только в режиме чтения. Использовать один и тот же файл одновременно и для записи, и для чтения нельзя!
В большинстве задач с файлами необходимо последовательно перебрать все компоненты и произвести определенную их выборку. Поэтому обычно возникает необходимость определить, указывает ли окно на какую-либо компоненту файла или оно уже вышло за пределы файла и указывает на маркер в конце файла.
Для определения этого факта в Паскале существует стандартная логическая функция EOF (f) (end of file). Её значения:
TRUE – если окно указывает на маркер конца файла f ;
FALSE – в противном случае.
Если значение EOF (f) равно TRUE, то обращение к процедуре READ недопустимо, т.е. приведет к ошибке.
Пример 1. Имеется символьный файл. Вывести из него все заглавные латинские буквы.
PROGRAM word (SYMB, OUTPUT);
TYPE V=FILE OF CHAR;
VAR SYMB: V; S: CHAR;
BEGIN RESET (SYMB);
WHILE NOT EOF(SYMB) DO
BEGIN READ (SYMB, S);
IF (S<=’Z’) AND (S>=’A’)
THEN WRITELN (S)
END
END.
В Турбо Паскале операции над файлами полностью реализованы в виде стандартных процедур и функций, которые можно разбить на четыре группы.
Рассмотрим операции каждой из этих групп.
Стандартная процедура ASSIGN (f, name) устанавливает связь между конкретным физическим файлом на диске и переменной файлового типа, являющейся представителем этого файла в программе. Здесь
f – имя файловой переменной,
name – строковое выражение, образующее символическое имя файла. Оно строится по правилам MS-DOS и может, например, включать в себя путь к нужному файлу.
Примеры:
n: STRING;
WRITE (‘введи имя файла’);
READLN (n);
ASSIGN (f, n).
Второй параметр может включать псевдоимена файлов, связанных с конкретным физическим устройством.
Процедуры RESET, REWRITE уже известны. Перед их выполнением файловая переменная должна быть связана с конкретным дисковым файлом с помощью процедуры ASSIGN.
Выполнение этих процедур подразумевает поиск файла на внешнем носителе, образование специальных системных буферов для обменов с ним и установку текущего указателя файла на его начало (т.е. на нулевой элемент).
Процедура
CLOSE (f) завершает действия с файлом.
При этом ликвидируются внутренние буфера,
образующиеся при открытии этого файла.
После этого файловую переменную f
можно связывать с каким-либо другим дисковым
файлом, если это нужно.
2. Собственно ввод-вывод
К этой группе операций относятся уже известные нам процедуры READ и WRITE. Они могут вызываться с различным числом параметров, имеющих различные типы (для текстовых файлов).
3. Перемещения по файлу
Эта группа содержит две процедуры и три функции.
Процедуры:
SEEK (f, num) – устанавливает окно (указатель) файла f на позицию с номером num. После выполнения процедуры SEEK дальнейшие операции чтения и записи производятся с этой позиции;
TRUNCATE (f) – удаление “хвоста” файла f, начиная с текущей позиции (текущего значения указателя).
Функции:
EOF (f) – уже известна;
FILEPOS (f) – возвращает номер элемента, на который установлен текущий указатель;
FILESIZE (f) – возвращает общее число элементов файла.
Используя эти функции, можно получить достаточно сложные алгоритмы. Приведем простые примеры использования этих операций.
SEEK (f, FILEPOS (f) + 1) – пропуск одного элемента;
SEEK (f, 0) – установка указателя на начало файла;
SEEK (f, FILESIZE (f)) – установка указателя непосредственно за последним элементом файла (для дописывания в “хвост”).
4. Специальные операции
Эта группа операций предназначена для действий с элементами файловой системы MS-DOS: каталогами и файлами. В нее входят следующие процедуры:
ERASE (f) – удаление файла на диске;
RENAME (f, newname) – переименование файла;
CHDIR (path) – устанавливает путь к новому текущему каталогу;
MKDIR (path) – создание нового каталога по пути, указанному в path;