Top.Mail.Ru

Turbo Pascal. Файловый тип данных

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 Var 
 <имя файла>:file of ;<тип элементов> 

Например,

Var
f:file of integer; {файловая переменная типа integer}
C:file of char; {файловая переменная типа char}

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

Type

TFI = file of integer;
TFC = file of char;
TMAS = array[1..10] of integer;
TR=record
fio:string;
mark:array[1..5] of integer;
sr:real;
end;
TFMAS:file of TMAS;
TFR:file of TR;
Var
Fint : TFI; {файловая переменная типа integer}
Fchar : TFC; {файловая переменная типа char}
fmas : TFMAS; {файловая переменная типа array}
fr : TFR; {файловая переменная типа record}

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

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

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

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

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

 Assign(<имя файловой переменной>,<имя внешнего файла>), 

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

Пример

f file of integer;

Assign(f,’d:\data.txt’);

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

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

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

Чтение файла

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 Reset(<имя файловой переменной>); 
 Read(<имя файловой переменной>, <переменная>); 
 Close(<имя файловой переменной>); 

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

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

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

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

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

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

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

 WhileNotEOF(<имя файловой переменной>) do оператор; 

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

var

f:file of integer; {файловая переменная}
n:integer;
begin

Assign(f,’d:\Text.txt’); {с файловой переменной f связываем файл Text.txt, расположенный на диске d:\}
Reset(f); {открываем файл для чтения}

{цикл повторяется, пока не будет, достигнут конец файла}
While NOT EOF(f) do { проверка на конец файла}
Begin
Read(f,n); {читаем число из файла}
Write(n,’ ‘); {вывод текста на экран монитора}
End;

Close(f); {закрываем файл}
End.

Запись в файл

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

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

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

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

Данной процедурой нельзя дополнить существующий файл. При выполнении процедуры ReWrite старый файл уничтожается, никаких сообщений не выдается. Новый файл подготавливается к приему информации, и его указатель принимает значение 0.

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

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

 Write(<имя файловой переменной>, <элемент>); 

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

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

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

 ReWrite (<имя файловой переменной>); 
 Write(<имя файловой переменной>, <элемент>); 
 Close(<имя файловой переменной>); 

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

var 

f:file of integer; {файловая переменная}
n:integer; {вводимое число}
begin
Assign(f,’d:\Text.txt’); {с файловой переменной f связываем файл Text.txt, расположенный на диске d:\ }
rewrite(f); {Открываем файл f для записи. Все данные будут уничтожены, указатель примет значение 0.}
writeln('для окончания ввода данных в файл введите - 0');
repeat {в цикле вводим числа с клавиатуры}
writeln('Введите число:');
readln(n);
if n0 then write(f,n); {если вводимое число не нуль, то записываем его в файл. В противном случае выходим из цикла}
until n=0;
close(fi); {закрываем файл}
End.

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

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

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

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

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

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

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

 N = Filesize(<имя файловой переменной>), 

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

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

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

 Seek(<имя ф.переменной>,Filesize(<имя ф.переменной>)); 

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

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

 Write(<имя файловой переменной>, <элемент>); 

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

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

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

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

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

2. Процедуры Read, Write смещают указатель к следующему элементу файла.

3. Установка указателя на элемент с номером N 

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

4. Определение номера элемента, на котором установлен указатель

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

5. Определение количества элементов файла

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