Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.docx
Скачиваний:
5
Добавлен:
25.09.2019
Размер:
245.64 Кб
Скачать

2. Обычно размер записи равен размеру кластера на устройстве (для дискет - 512 байт) или 1 байт.

ReWrite(<файловая переменная>,[<размер записи>]); Пример: rewrite(fara,512); Примечания - те же, что для reset.

Чтение из файла

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

Процедура Read(<файловая переменная>,<переменная - буфер чтения>, <переменная - буфер чтения>,...); Переменные должны быть объявлены как переменные того же типа, что и базовый тип файла.

Исполнение этой процедуры:

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

Файловый указатель перемещается на это же количество байт вперед, к началу соответствущей записи.

Ясно, что для чтения файла процедуру Read нужно исполнить многократно, обычно - в цикле. Для избежания аварии нужно каждый раз проверять - не стоит ли указатель на конце файла. Для этого есть функция eof(<файловая переменная>). Это - булевская функция. Она возвращает true, если файловый указатель находится в конце файла, т е дальше последнего байта файла и возвращает false - иначе.

Пример программы.

Убедимся, что файл, открытый процедурой rewrite

можно читать.

Var f1: file of double; buf: double; II: byte;

begin

Assign(f1, 'myfile.dub'); rewrite(f1);

for ii:= 1 to 9 do

begin buf:= 10*ii+ii/10;

write(f1,buf);

end;

seek(f1,4);

for ii:= 1 to 5 do

begin buf:= 77.7;

write(f1,buf);

end;

close(f1);

reset(f1);

while not eof(f1) do

begin

read(f1,buf);

writeln(buf);

end;

close(f1);

end.

(Файл MyFILE.DUB появился в той же папке, где

находится turbo.exe, а при запуске откомпилированного

файла, т е FILE1.EXE файл MyFILE.DUB появился

в той же папке, где находится FILE1.EXE. В обоих

случаях - в текущей папке)

---- Результат: -----

1.01000000000000E+0001

2.02000000000000E+0001

3.03000000000000E+0001

4.04000000000000E+0001

7.77000000000000E+0001

7.77000000000000E+0001

7.77000000000000E+0001

7.77000000000000E+0001

7.77000000000000E+0001

Текстовые файлы

Параметры-переменные, которые заполняются данными при помощи процедур read/readln из текстовых файлов, могут иметь типы: char, string, PChar, численные типы (целые и вещественные). Аналогично, процедуры write/writeln записывают из параметров- выражений этих же типов и boolean (в виде true или false). Процедура read имеет синтаксис:

read ([<файловая переменная>,]<переменная-буфер>, <переменная-буфер>,...); При этом данные (численные), записанные в файле, должны отделяться друг от друга пробелом или знаком табуляции, так что очередная порция данных между разделителями сохраняется в очередной переменной из списка параметров. Переменная-буфер должна иметь тип - один из численных. Если переменная-буфер имеет тип char, то данные в файле читаются посимвольно в соответствующие переменные. Если переменная-буфер имеет тип string[N], то данные в файле читаются по N символов в соответствующие переменные, в частности, string - читается 255 символов. Если в файле встретится новая строка (#13#10) чтение данных из файла прекратится. Процедура readln делает то же самое, но способна читать признак конца строки (#13#10) и переходить к чтению следующей строки файла.

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

Чтение производит процедура BlockRead, которая имеет синтаксис: BlockRead(<файловая переменная>,<переменная - буфер чтения>, N [, fact]);

где: N - (выражение) - сколько записей нужно прочесть,

переменная - буфер должна имет размер не менее, чем N*<размер записи>

необязательный параметр fact возвращает число фактически прочитанных записей ( если достигнут конец файла и прочтено < N записей.)

Запись в файл.

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

Процедура Write(<файловая переменная>,<переменная - буфер записи>, <переменная - буфер записи>,...); Переменные должны иметь тип - базовый тип файла.

Исполнение этой процедуры:

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

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

Текстовые файлы

Процедура write имеет синтаксис:

write ([<файловая переменная>,]<выражение>, <выражение>,...);

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

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

Запись производит процедура BlockWrite, которая имеет синтаксис: BlockWrite(<файловая переменная>,<переменная - буфер записи>, N [, fact]);

где: N - (выражение) - сколько записей нужно прочесть,

переменная - буфер должна имет размер не менее, чем N*<размер записи>

необязательный параметр fact возвращает число фактически записанных записей.

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

Что такое файл? Под ним понимается определенная последовательность однотипных компонентов, имеющих определенный ограничитель - конец файла, который располагается на внешнем устройстве. Исторически и повсеместно, а не только в языке Паскаль компонент файла принято называть записью. Запись в файле не следует путать с типом данных в Паскале. Это в первую очередь законченный компонент, при котором выполняются операции чтения из файла или записи в него. Размер записи в файле определяется его типом.

Как определить тип файла? Для начала нужно определить список тех элементов, которые входят в его состав. Количество компонентов определения не требует. Язык программирования Паскаль позволяет выполнять некоторые действия и без определения типа файла. Для этого ему присваивают тип FILE и называют его нетипизированным. Однако стандартные операции по чтению и записи файла в таком случае невозможны.

Все файлы принято подразделять на физические и логические.

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

Физический файл - это файл, который уже определен и обозначен конкретной операционной системой по определенным правилам. Ему присвоено имя и местоположение на внешнем устройстве.

Способ работы с тем или иным файлом зависит и от его вида. На внешнем носители различаются следующие файлы: последовательные, файлы прямого доступа и текстовые (или символьные) файлы. Правильное определение вида, как и типа файла способствует более быстрому освоению навыков работы с языком Паскаль.

10. Наиболее часто приходится иметь дело с текстовым представлением информации, поэтому рассмотрим запись и чтение текстового файла.Приступая к работе с файлом, нужно первым делом вызвать процедуру AssignFile, чтобы файловой переменной поставить в соответствие имя файла на диске:AssignFile(F, 'MyFile.txt').В результате этого действия поля файловой переменной F инициализируются начальными значениями. При этом в поле имени файла заносится строка 'MyFile.txt'.Так как файла еще нет на диске, его нужно создать:Rewrite(F);Теперь запишем в файл несколько строк текста. Это делается с помощью хорошо вам знакомых процедур Write и Writeln:Writeln(F, 'Pi = ', Pi).Writeln(F, 'Exp = ', Exp(1)).При работе с файлами первый параметр этих процедур показывает, куда происходит вывод данных.После работы файл должен быть закрыт:CloseFile(F).Рассмотрим теперь, как прочитать содержимое текстового файла. После инициализации файловой переменной (AssignFile) файл открывается с помощью процедуры Reset:Reset(F).Для чтения элементов используются процедуры Read и Readln, в которых первый параметр показывает, откуда происходит ввод данных. После работы файл закрывается. В качестве примера приведем программу, распечатывающую в своем окне содержимое текстового файла 'MyFile.txt':program Console;

{$APPTYPE CONSOLE}

uses

SysUtils;

var

F: TextFile;

S: string;

begin

AssignFile(F, 'MyFile.txt');

Reset(F);

while not Eof(F) do

begin

Readln(F, S);

Writeln(S);

end;

CloseFile(F);

Writeln('Press Enter to exit...');

Readln;

end.

Так как обычно размер файла заранее не известен, перед каждой операцией чтения вызывается функция Eof, которая возвращает True, если достигнут конец файла.Внимание! Текстовые файлы можно открывать только для записи или только для чтения, но не для того и другого одновременно. Для того чтобы сначала записать текстовый файл, а потом прочитать, его нужно закрыть после записи и снова открыть, но уже только для чтения.

11. Запись – это структура, состоящая из фиксированного числа компонент, называемых полями. Данные одного поля разных записей имеют один и тот же тип, а разных полей могут иметь разные типы. Общий вид описания типа record:

type t = record

id11, id12, …: type1;

id21, id22, …: type2;

……………….

end;

здесь id – идентификаторы полей; type – типы полей; t – имя типа.

Пример. Данные комплексного вида можно описать переменной типа record.

type complex = record

re, im: real

end;

var c: complex;

здесь complex – имя типа, а c – имя переменной. Переменная c состоит из двух полей: re и im, имеющих один и тот же тип (real). Эти поля переменной c обозначаются как c.re и c.im.

Пример. Даты каких-либо событий можно описать следующим образом:

type date = record

month: 1..12;

day: 1..31;

year: integer

end;

var d: date;

В этом примере описан тип date и переменная d, принадлежащая этому типу. Переменная d описана как запись, состоящая из трех полей: month, day и year. Каждое поле содержит соответственно данные: целое число в пределах от 1 до 12 (номер месяца), целое число от 1 до 31 (число), целое число (год). Поле day переменной d записывается как d.day. Например, чтобы заслать в d дату 12.01.2003, надо выполнить следующие операторы:

d.month := 1;

d.day := 12;

d.year := 2003;

Пример. Вычислить сумму s двух комплексных чисел x = 2 + 7i и y = 6 + 3i (т.е. x, y, s: complex;).

x.re := 2.0; x.im := 7.0;

y.re := 6.0; y.im := 3.0;

s.re := x.re + y.re;

s.im := x.im + y.im;

Запись может быть компонентой других структур. Например, введем тип family (семья: отец, мать, 1-й ребенок, 2-й ребенок):

type family = (father, mother, child1, child2);

var birthday: array[family] of date; где date – описанная выше запись.Переменная birthday есть массив, состоящий из записей – дат рождения членов семьи: отца, матери, 1-го ребенка, 2-го ребенка. Каждая дата рождения имеет тип date, который может быть описан в программе.Для занесения даты рождения, например, mother, достаточно выполнить операторы:

birthday[mother].month := 5;

birthday[mother].day := 1;

birthday[mother].year := 1965;

12. Для внешних файлов определены два сорта доступа: последовательный доступ и прямой доступ. В настраиваемых пакетах SEQUENTIAL_IO и DIRECT_IO описаны соответствующие файловые типы и связанные с ними операции. Объект файлового типа, используемый для последовательного доступа, называется последовательным файлом, а используемый для прямого доступа — прямым файлом.

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

При прямом доступе файл рассматривается как набор элементов, занимающих последовательные позиции в линейном порядке; значение может быть передано в элемент файла (или из него), находящийся в любой выбранной позиции. Позиция элемента задается его индексом, который является положительным числом определяемого реализацией целого типа COUNT. Индекс первого элемента в файле (если он есть) равен единице; индекс последнего элемента (если он есть) называется текущим размером; текущий размер файла, не содержащего ни одного элемента, равен нулю. Текущий размер — это характеристика внешнего файла.

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

Для прямых файлов допустимы все три вида файла. Для последовательных файлов допустимы только виды IN_FILE и OUT_FILE.

Ссылки: вид файла 14.1, тип 14.3, файл вида IN_FILE 14.1, файл вида OUT_FILE 14.1.