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

Обновлено: 18.05.2024

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

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

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

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

Более характерным для Pascal являются типизированные файлы, или файлы произвольного доступа. Основным свойством этих файлов является то, что их структура данных представляет собой последовательность компонентов одного типа. Описывают подобный файл словосочетанием file of с последующим указанием типа компонентов файла, число которых (длина файла) не фиксируется:

var имя_файла : file of тип_компонентов

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

В этом описании указано, что элементами файла являются данные типа Integer , занимающие 2 байта (или 4?). При этом отпадает необходимость в специальном разделении элементов файла, как это делалось в текстовых файлах. Также возможен произвольный доступ к элементам данных (этим типизированный файл несколько напоминает одномерный массив).

Чтобы можно было работать с типизированным файлом, необходимо, как и для текстовых файлов, сначала связать имя файловой переменной с внешним именем файла (оператор Assign). Затем нужно открыть его (используются операторы Reset и Rewrite, но не Append). Операторы Reset и Rewrite открывают файл и для чтения, и для записи (а не только для чтения или только для записи, как при использовании текстовых файлов). Отличие их в том, что оператор Reset открывает только существующий файл (если такого файла нет, будет сгенерирована ошибка времени выполнения). С другой стороны, оператор Rewrite создает новый файл (если файл с таким именем уже имеется, то он будет уничтожен и создан заново). При открытии файла с ним связывается текущий указатель файла, который позиционируется на его первый элемент. Оперировать можно только тем элементом файла, на который ссылается указатель файла. При чтении или записи элемента файла происходит автоматическое перемещение указателя на следующий элемент. Чтение из типизированного файла производится оператором Read (но не ReadLn), а запись в него — оператором Write (но не WriteLn). Однако следует помнить, что в списке вывода оператора Write могут быть только переменные. Типы элементов файла и типы переменных в списках ввода-вывода должны быть согласуемы по присваиванию. Элементами типизированных файлов могут быть числовые, символьные, булевы, строковые значения, массивы, записи, но не файлы или структуры с файловыми элементами.

Узнать количество элементов типизированного файла (размер файла) можно с помощью функции FileSize , для которой используется следующий синтаксис:

Например, если переменная k имеет тип LongInt, а f – файловая переменная типизированного файла, то оператор k := FileSize(f), записывает в переменную k размер файла f.

Элементы типизированного файла нумеруются с нуля (порядковый номер последнего элемента файла на единицу меньше размера файла). Чтобы узнать, на каком элементе располагается указатель файла, используют функцию FilePos:

Текущим положением указателя можно управлять, для чего служит процедура Seek , которая использует следующий синтаксис:

Второй параметр (тип LongInt ) задает номер элемента (отсчет от 0), на который должен переместиться указатель файла. Рассмотрим несколько примеров.

Перейти к пятому (фактически шестому) элементу файла f :

Перейти к предыдущему элементу:

Перейти в конец файла:

Как и для текстовых файлов, можно использовать функцию Eof(имя_файла), которая возвращает значение True, если текущий указатель расположен на признаке конца файла (т. е. при выполнения равенства FilePos(имя_файла) = FileSize(имя_файла)).

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

Текстовые файлы могут быть созданы текстовым редактором. Однако типизированные файлы создаются в результате работы какой-либо программы.

Пример записи данных в типизированный файл:

Пример последовательного доступа к типизированному файлу:

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

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

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

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

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

Пример 1.

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

program type_fail;
uses crt;
var
f : file of integer ;
x , n , i : integer ;
sr : real ;
begin
assign ( f , ‘file.dat’ ) ;
rewrite ( f ) ;
write ( ‘Количество элементов ‘ ) ; read ( n ) ;
for i := 1 to n do
begin
readln ( x ) ;
write ( f , x ) ;
end ;
clrscr; n := 0 ;
reset ( f ) ;
while not eof ( f ) do
begin
read ( f , x ) ;
n := n + x;
end ;
sr := n / filesize ( f ) ;
close ( f ) ;
write ( ‘Среднее арифметическое = ‘ , sr ) ;
end .

Пример 2.

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

program type_fail;
uses crt;
var
f : file of string ;
i : integer ;
s , s1 , s2 , s3 : string ;
begin
assign ( f , ‘file.dat’ ) ;
s1 := ‘Pascal’ ;
s2 := ‘ на ‘ ;
s3 := ‘Программирование’ ;
rewrite ( f ) ;
write ( f , s1 , s2 , s3 ) ;
reset ( f ) ;
write ( ‘Выводим как есть: ‘ ) ;
while not eof ( f ) do
begin
read ( f , s ) ;
write ( s ) ;
end ;
writeln ;
write ( ‘Вывод после обработки: ‘ ) ;
for i := 2 downto 0 do
begin
seek ( f , i ) ;
read ( f , s ) ;
write ( s ) ;
end ;
close ( f ) ;
end .

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

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

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

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

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

Процедура BlockRead

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

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

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

Процедура BlockWrite

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

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

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

program no_type_fail;
uses crt;
var
f : file ;
x , i , n : byte ;
begin
clrscr;
assign ( f , ‘f’ ) ;
rewrite ( f , 1 ) ;
write ( ‘n = ‘ ) ; readln ( n ) ;
for i := 1 to n do
begin
x := n — i;
blockwrite ( f , x , 1 ) ;
end ;
reset ( f , 1 ) ;
while not eof ( f ) do
begin
blockread ( f , x , 1 ) ;
write ( x , ‘ ‘ ) ;
end ;
close ( f ) ;
readkey;
end .

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

Файл – последовательность элементов одного типа, которой присвоено общее имя.

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

Различают дисковые файлы и логические устройства.

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

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

  • CON– консоль: при выводе данных соответствует экрану, при вводе – клавиатуре;
  • PRN– принтер;

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

Переход по элементам файла

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

В зависимости от способа представления информации различают три типа файлов:

  • типизированные файлы;
  • текстовые файлы;
  • нетипизированные файлы.

Текстовые файлы – это файлы, содержащие строки переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой. Одновременная запись и чтение запрещены.

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

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

Типизированный файл – файл с объявленным типом элементов, т.е. файл с одной и той же структурой элементов.

В языке Турбо Паскаль ввод-вывод информации осуществляется через файловые переменные. Файловая переменная типизированного файла объявляется так:

1. Объявления в разделе переменных

2. Объявления в разделе типов

Работа с файлом включает:

  • инициализацию файловой переменной – установление связи файловой переменной с файлом операционной системы;
  • открытие файла – подготовку файла для выполнения операций ввода/ вывода;
  • обработку элементов файла – выполнение операций ввода-вывода;
  • закрытие файла.

Инициализация файловой переменной

В программе файл является переменной, называемой файловой переменной. Для установления связи между файловой переменной в программе и файлом операционной системы, используется стандартная процедура Assign .

Формат процедуры:

здесь: имя внешнего файла – имя дискового файла, расположенного на внешнем носителе. Если файл находится в текущем каталоге, то достаточно указать имя файла и его расширение. В противном случае необходимо указать полное имя файла.

Пример

Установление соответствия между файловой переменной и дисковым файлом операционной системы означает, что все операции, выполняемые над файловой переменной, например, над f , будут выполняться над файлом, хранящимся на диске d:\ и, имеющем имя ‘data.txt’ .

Рассмотрим основные операции, выполняемые с фалами:

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

Чтение файла

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

Для чтения файла необходимо выполнить следующие действия:

1. Открыть файл для чтения

Формат процедуры:

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

2. Прочитать данные из файла в файловую переменную

Формат процедуры:

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

3. Закрыть файл

Формат процедуры:

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

Общая схема чтения файла:

Признак конца файла

Поскольку в файле число элементов не задается заранее, то в Турбо Паскале введен признак конца файла EOF – EndOfFile . Это логическая переменная возвращает TRUE – если достигнут конец файла и FALSE – конец файла не достигнут.

Формат процедуры:

Процедура возвращает:

TRUE (истина) – конец файла,
FALSE (ложь) – конец файла не достигнут .

Для определения конца файла используется оператор цикла

WhileNotEOF( ) do оператор;

ЗАДАЧА 1. Разработать программу, которая выполняет чтение файла, содержащего целые числа.

Запись в файл

Для записи необходимо выполнить следующие действия:

1. Открыть файл для записи

Формат процедуры:

2. Записать данные в файл, при этом данные записываются поэлементно

Формат процедуры:

3. Закрыть файл

После работы с файлом его закрытие обязательно.

Общая схема записи в файл:

ReWrite ( );
Write( , );
Close( );

ЗАДАЧА 2. Разработать программу, которая записывает в файл целые числа. Ввод чисел выполнить с клавиатуры.

Добавление элементов в файл

Для добавления элементов в файл необходимо выполнить следующие действия:

1. Открыть файл для чтения

Формат процедуры:

2. Переместить указатель в конец файла

Для перемещения указателя воспользуемся процедурой Seek .Процедура Seek( , N) перемещает текущий указатель на N-й элемент. Номер последнего элемента N в файле можно определить с помощью функции

где N - количество элементов в файле.

В этом случае, функция Seek может быть записана так:

Формат функции:

3. Выполнить запись элемента

Формат процедуры:

4. Закрыть файл

Формат процедуры:

Общие характеристики файловых процедур

1. После выполнения процедур открытия файла для чтения, записи ( Reset, Rewrite ) указатель установлен на первый элемент файла (элемент с номером 0 ).

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