Как создать типизированный файл

Обновлено: 02.07.2024


Горбачев Л.И. Основы программирования в среде Turbo Pascal.

2. Типизированные файлы.

Типизированный файл - это файл, состоящий из элементов любого типа данных, кроме файлового, например:

Для осуществления передачи данных из типизированного файла в программу (чтение данных) используется процедура:
- Read(F, X1[, X2. Xn]) - считывает в переменную X1 (пересылка данных в программу из файла) один элемент файла F (или несколько элементов в переменные X1. Xn), начиная чтение с элемента, на который указывает текущий указатель. Если F опущено, то подразумевается стандартный файл Input.
Процедура чтения выполнима только в случае, если Eof(F) = False;

Для осуществления пересылки данных из программы в типизированный файл (запись данных) используется процедура:
- Write(F, X1[, X2. Xn]); - записывают одно (X1) или более (X1, X2. Xn) значений переменных в файл F, начиная с той позиции, на которую установлен указатель. Если F опущено, то подразумевается стандартный файл Output. Write выполним только в случае, если Eof(F) = True.

2.1. Основные операции с внешними типизированными файлами.

  • запись данных в файл;
  • чтение данных из файла;
  • добавление данных в файл;
  • изменение данных в файле.

В каждом случае предполагается, что файл F в программе уже связан с процедурой Assign с внешним файлом на диске.

2.1.1. Запись данных в файл.

Под записью данных в файл понимается вывод результатов исполнения программы из оперативной памяти ЭВМ на диск. Файл, в который записываются данные из программы, называют выходным.
  1. открыть новый файл для записи (Rewrite);
  2. вывести данные из программы в файл (Write);
  3. закрыть файл для записи (Close);

Здесь F - имя файла; A1, A2. An - выражения (в том числе константы и переменные) того же типа, что и элементы файла.

Процедура Rewrite осуществляет подготовку к записи информации в новый файл F (очищает файл и устанавливает указатель в начале файла). Оператор Write записывает значения выражений A1, A2, . An по одному в конец файла F (после имеющейся в нем информации).

Пример: Программа, с помощью которой происходит запись данных о студентах в новый типизированный файл (имя файла вводит пользователь).
[program DemoWrite]

2.1.2. Чтение данных из файла.

  1. открыть файл для чтения (Reset);
  2. ввести данные файла в программу (Read);
  3. закрыть файл для чтения (Close).

Общая структура фрагмента программы, составленной для чтения файла, имеет вид:

Тип переменных X1, X2. Xn должен соответствовать базовому типу элементов файла (это условие не обязательно для текстовых файлов). Процедура Reset осуществляет подготовку к чтению из файла F (открывает файл и устанавливает указатель на первый элемент файла).

Оператор Read последовательно присваивает переменным X1, X2, . Xn значения из файла F. Количество этих переменных не должно превышать количества данных, которые могут быть введены из файла. В противном случае выполнение программы прекращается. Вместо Read(F, X1, X2. Xn) можно использовать несколько операторов Read:

Read(F, X1); Read(F, X2); . Read(F, Xn);

После чтения очередного элемента указатель файла устанавливается на следующий за прочитанным элемент файла.

Процедура Close выполняет закрытие файла F.

Пример: Программа, с помощью которой происходит чтение данных из типизированного файла.
[program DemoRead]

2.1.3. Добавление данных в файл.

  • для типизированных файлов открыть уже существующий файл F процедурой Reset;
  • установить указатель файла за его последней записью процедурой Seek следующим образом: Seek(F, FileSize(F));
  • записать дополнительные данные (Write);
  • закрыть файл (Close);

2.1.4. Изменение элементов файла.

Турбо Паскаль позволяет осуществлять прямой выбор элементов файла. Для этого используется процедура Seek:

где F - имя файла, который был ранее открыт процедурой Reset; N - целое положительное число или выражение, соответствующее порядковому номеру элемента в файле.

После выполнения процедуры Seek(F,N) указатель текущего элемента в файле переместится к элементу с номером N. Теперь этот элемент можно прочитать операторами Read и Write. Каждое повторное использование этих операторов будет осуществлять последовательное чтение или запись элементов файла, начиная с последующего (N + 1 - го) элемента.

Файл, определенный стандартным или пользовательским типом данных, называется типизированным. Общая форма объявления типизированных файлов имеет вид:

Var <имя файла>: File of <тип компонент>;

Здесь тип компонент может быть любым типом данных, определенных в Pascal, но только не файловым. Для работы с типизированными файлами используются уже знакомые нам процедуры и функции: Write, Read, Seek, Filesize, Filepos, а также процедура Truncate:

Truncate(<имя файловой переменной>)

Она удаляет все компоненты в файле, начиная с того над которым находиться указатель.

Одной из главных особенностей типизированного файла является возможность прямого обращения к его отдельным компонентам. Это достигается за счет, того что заранее известен тип компонент файла. Рассмотрим два примера кода, в первом из которых обращение к элементам файла происходит последовательно, а во втором прямо.

Пример 1.

Вычислить среднее арифметическое элементов файла.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

Пример 2.

Поменять строки в файле местами.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

Таким образом, напрашивается вывод, что типизированные файлы несколько функциональней в обработке, чем текстовые. Далее разберем последний пункт данной статьи, а именно третий вид файлов — бестиповые файлы.

Бестиповые (нетипизированные) файлы

Бестиповые файлы предназначены для записи участков памяти компьютера на внешний носитель и считывания их в память. В отличие от типизированных файлов, нам не нужно знать информация какого типа хранится в них. А все потому, что данные из файлов, не имеющих типа, считываются в виде байт, после чего они «подстраиваются» под переменную, в которую происходит считывание.

Общая форма записи нетипизированных файлов

отличается от типизированных отсутствием части of <тип данных>. Кроме того, немного изменяется принцип действия процедур Reset и Rewrite. К ним прибавляется второй параметр типа Word:

reset(<имя файловой переменной>, <значение>)

rewrite(<имя файловой переменной>, <значение>)

Здесь «значение» — это новый размер буфера, который по умолчанию равен 128 байтам. В качестве минимального значения можно указать 1 байт, а максимального — 64 кбайт (число в байтах).

Также в бестиповых файлах для записи и чтения информации используются не стандартные процедуры Read и Write, а две новые: BlokRead и BlockWrite. Рассмотрим каждую из них.

Процедура BlockRead

Данная процедура считывает из файла заданное число записей, которые помещаются в память.

Общая форма записи:

BlockRead(<имя файловой переменной>, <x>, <количество байт>, <y>);

x, y – обычные переменные, в первую помещается прочитанные данные, во вторую – количество считанных байт. В случае удачи y (y – необязательный параметр) будет иметь тоже значение, что и третий параметр.

Процедура BlockWrite

Для записи информации в бестиповый файл предназначена процедура BlockWrite:

BlockWrite(<имя файловой переменной>, <x>, <количество байт>, <y>);

Параметры процедуры BlockWrite точно такие же, как и у BlockRead. Да и принцип их одинаков, за исключением того, что первая записывает данные в файл, а вторая считывает их из него.

В следующей программе данные сначала записываются в нетипизированный файл, а затем выводятся из него посредством рассмотренных нами операций.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

Возможно, что ваша среда программирования не поддерживает работу с файлами, не имеющими типа. Поэтому прежде чем начать искать ошибку в коде, стоит узнать про данную функцию.

Типизированный файл – это файл, в котором содержатся однотипные данные. Типизированный файл задается с помощью 2-х ключевых слов «file of». После слова «of» указывается тип файла, например integer, real, char, string и т.д. Тип файла может быть любым за исключением файлового типа (не может быть файла файлов) и комбинированного типа, один из компонентов которого имеет файловый тип.

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

Напишем программу, которая создаст своеобразную базу данных, хранящей сведения о студентах: их именах, номерах курса и групп.

Типизированные файлы в Паскаль.

Строка №3-№6. Объявляем в программе тип Record и указываем для него компоненты. Первый компонент «fio» (строка №4) будет описывать фамилию и инициалы студента. Компоненты «kurs» и «group» будут описывать соответственно номер курса и номер группы.

Строка №7. Объявляем переменную «zap» и указываем для нее тип «Student». Теперь с помощью переменной «zap» мы можем обратиться к любому компоненту записи.

Строка №8. Создаем файловую переменную «f» и указываем для нее тип «Student». Таким образом, мы создаем файл записей, где будет храниться информация о студентах.

В строке №9 создаем переменную «name», которая понадобится нам для создания имени файла.

Строка №13. Вводим с клавиатуры имя файла. Это имя будет записано в переменную «name».

Строка №14. Связываем файловую переменную «f» с именем файла. Как и в случае с текстовыми файлами связывание файловой переменной с файлом производится с помощью процедуры Assign

Строка №15. Открываем файл для записи. Открытие типизированного файла для записи производится аналогично текстовым файлам с помощью процедуры Rewrite. Так как самого файла не существует, он будет создан автоматически и будет иметь имя, которое мы задали в строке №13.

Строка №18. Записываем цикл. До тех пор пока не будет введено пустое значение для компонента «zap.fio» необходимо выполнять действия, записанные в строках №20 - №24. Знак <> означает неравно. После этого знака в апострофах записывается значение, которому не должен быть равен компонент «zap.fio». Внутри апострофов мы ставим знак пробела. Таким образом, цикл будет выполняться до тех пор, пока вместо фамилии очередного студента не будет нажата клавиша «пробел».

В разделе var файловые переменные , предназначенные для работы с типизированными файлами , описываются следующим образом:

Никакая файловая переменная не может быть задана константой.

Назначение типизированного файла

С этого момента и до конца раздела под словом "файл" мы будем подразумевать " бинарный типизированный файл " (разумеется, если специально не оговорено иное).

Команда assign (f,'<имя_файла>'); служит для установления связи между файловой переменной f и именем того файла, за работу с которым эта переменная будет отвечать.

Строка ' <имя_файла> ' может содержать полный путь к файлу. Если путь не указан, файл считается расположенным в той же директории, что и исполняемый модуль программы.

Открытие и закрытие типизированного файла

В зависимости от того, какие действия ваша программа собирается производить с открываемым файлом, возможно двоякое его открытие:

reset(f); - открытие файла для считывания из него информации и одновременно для записи в него (если такого файла не существует, попытка открытия вызовет ошибку). Эта же команда служит для возвращения указателя на начало файла;

rewrite (f); - открытие файла для записи в него информации; если такого файла не существует, он будет создан; если файл с таким именем уже есть, вся содержавшаяся в нем ранее информация исчезнет.

Закрываются типизированные файлы процедурой close(f) , общей для всех типов файлов.

Считывание из типизированного файла

Чтение из файла, открытого для считывания, производится с помощью команды read() . В скобках сначала указывается имя файловой переменной, а затем - список ввода 1 См. лекцию 1. :

read(f,a,b,c); - читать из файла f три однотипные переменные a , b и c .

Вводить из файла можно только переменные соответствующего объявлению типа, но этот тип данных может быть и структурированным. Cкажем, если вернуться к примеру, приведенному в начале п. " Типизированные файлы ", то станет очевидным, что использование типизированного файла вместо текстового позволит значительно сократить текст программы:

Поиск в типизированном файле

Уже знакомая нам функция eof (f:file):boolean сообщает о достигнутом конце файла. Все остальные функции "поиска конца" ( eoln() , seekeof() и seekeoln() ), свойственные текстовым файлам, нельзя применять к файлам типизированным .

Зато существуют специальные подпрограммы, которые позволяют работать с типизированными файлами как со структурами прямого доступа:

  1. Функция filepos(f:file):longint сообщит текущее положение указателя в файле f . Если он указывает на самый конец файла , содержащего N элементов, то эта функция выдаст результат N . Это легко объяснимо: элементы файла нумеруются начиная с нуля, поэтому последний элемент имеет номер N-1 . А номер N принадлежит, таким образом, "несуществующему" элементу - признаку конца файла .
  2. Функция filesize(f:file):longint вычислит длину файла f .
  3. Процедура seek (f:file,n:longint) передвинет указатель в файле f на начало записи с номером N . Если окажется, что n больше фактической длины файла, то указатель будет передвинут и за реальный конец файла .
  4. Процедура truncate (f:file) обрежет "хвост" файла f : все элементы начиная с текущего и до конца файла будут из него удалены. На самом же деле произойдет лишь переписывание признака " конец файла " в то место, куда указывал указатель, а физически "отрезанные" значения останутся на прежних местах - просто они станут "бесхозными".
Запись в типизированный файл

Сохранять переменные в файл, открытый для записи , можно при помощи команды write() . Так же как и в случае считывания, первой указывается файловая переменная, а за ней - список вывода :

write(f,a,b,c); - записать в файл f (предварительно открытый для записи командами rewrite (f) или reset(f) ) переменные a , b , c .

Выводить в типизированный файл можно только переменные соответствующего описанию типа данных. Неименованные и нетипизированные константы нельзя выводить в типизированный файл .

Типизированные файлы рассматриваются как структуры одновременно и прямого, и последовательного доступа . Это означает, что запись возможна не только в самый конец файла , но и в любой другой его элемент. Записываемое значение заместит предыдущее значение в этом элементе (старое значение будет "затерто").

Например, если нужно заместить пятый элемент файла значением, хранящимся в переменной а , то следует написать следующий отрывок программы:

Замечание: Поскольку и чтение из файла, и запись в файл сдвигают указатель на следующую позицию, то в случае, когда необходимо сначала прочитать значение, хранящееся в каком-то элементе, а затем вписать на это место новые данные, необходимо производить поиск дважды:

Читайте также: