Смекни!
smekni.com

Структура Паскаль-программы (стр. 4 из 5)

Предназначены для хранения текстовой информации. По своей структуре эти файлы представляют собой последовательность символьных строк переменной длины. Каждая строка текстового файла заканчивается признаком конца строки (коды CR (13), LF (10)). Заканчивается текстовый файл признаком конца файла (код EOF (26)). К каждой строке текстового файла возможен только последовательный доступ, начиная с первой. То есть, текстовые файлы – это файлы с последовательным доступом.

varft: text;

begin

assign(ft, ‘ ‘);

reset(ft) / rewrite(ft) / append(ft);

Append(<ф.пер.>) – служит для открытия текстового файла для записи в конец.

Для чтения из текстового файла используются процедуры: Read(ft, <список ввода>), Readln(ft, <список ввода>). Список ввода – последовательность из одного или более имён переменных типа Char, String, а также любого целого или вещественного типов. В эти переменные будут помещаться значения из файла. После любой операции чтения указатель перемещается на следующую позицию.

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

Read(ft, ch);

Если перед выполнением чтения указатель файла достиг конца строки, то результатом чтения будет символ CR с кодом 13. Если указатель стоит на конце файла, то результатом чтения будет символ с кодом 26.

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

st: string[20];

read(ft, st);

Если строка файла больше, чем длина строковой переменной, указанной в процедуре Read, то лишние символы до конца строки файла отбрасываются, а новое обращение к Readвернёт пустую строку. С помощью процедуры Readнельзя прочитать последовательность строк. Для ввода последовательности строк нужно использовать процедуру Readln. Её также можно задавать без списка ввода.

При вводе числовых переменных процедура Readвыделяет подстроку во входном потоке по следующему правилу: все пробелы, символы табуляции и маркеры конца строк пропускаются. После выделения первого значащего символа и всех последующих символы пробела, табуляции служат признаком конца подстроки.

x: integer;

Read(ft, x);

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

Процедуры записи в файл: Write(ft, <список вывода>), Writeln(ft, <список вывода>).

Список вывода – список выражений типа Char, String, Boolean, а также любого целого или вещественного типа. Для любого выводимого параметра можно указывать минимальную ширину поля, в которое будет выведено символьное представление значения.

write(ft, x:4);

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

Три функции, которые можно применять только к текстовым файлам:

Eoln(ft: text): Boolean – проверяет, где стоит файловый указатель. Если он стоит в конце текущей строки, то функция возвращает True. В противном случае – False.

SeekEoln(ft: text): Boolean– перемещает файловый указатель до первого значащего символа или до маркера конца строки, пропускает все пробелы и знаки табуляции. Возвращает True, если указатель стоит на маркере конца строки, и False– если на значащем символе.

SeekEof(ft: text): Boolean – работает так же, как SeekEoln, только относительно конца файла, а не строки.

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

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

var fp: file of <тип>;

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

Для чтения из файла используется только процедура Read. Список ввода – список имён переменных того же типа, что и тип элементов файла. Для записи используется только процедура Write. Список вывода – список выражений того же типа, что и тип элементов файла.

Seek(fp: fileofreal, N: longint) – перемещает указатель на номер Nэлемента файла.

Seek(fp, 0L) – перемещает указатель в начало файла.

FileSize(fp): longint – возвращает количество элементов в файле.

FilePos(fp): longint – возвращает номер элемента файла, на котором стоит указатель.

www.fepo.ru

230101.65

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

type mas = array[1..100] of real;

var a, b: mas;

f: file of mas;

begin

assign(f, ‘file.dat’);

rewrite(f);

………… {запись элементов в массивы}

write(f, a, b);

close(f);

end.

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

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

program tip-file;

type complex = record

re, im: real

end;

var x: complex;

f1: text;

f2: file of complex;

begin

assign(f1, ‘tipfile.dat’);

reset(f1);

assign(f2, ‘tipfile.res’);

rewrite(f2);

while not eof(f1) do begin

read(f1, x.re, x.im);

write(f2, x);

end;

close(f1);

close(f2);

end.

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

vardata: file;

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

Нетипизированный файл можно открыть либо на чтение (Reset), либо на запись (Rewrite).

reset(data, [N]);

rewrite(data, [N]);

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

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

BlockWrite(var f: file; var x; count: word; [var num: word]) – запись в файл.

BlockRead(var f: file; var x; count: word; [var num: word]) – чтение из файла.

f – файловая переменная.

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

count– количество записей, которые должны быть прочитаны (или записаны) за одно обращение к файлу.

num– при выходе из процедуры содержит количество фактически обработанных записей.

Если N – длина одной записи, то за одно обращение к файлу нельзя прочитать больше, чем count*Nбайт. И эта величина также не может превышать 64 кБ. Длина внутреннего представления переменной xдолжна быть достаточной для размещения count*N байтов при чтении из файла. Если при записи в файл процедурой BlockWriteна диске не окажется свободного места или при чтении из файла процедурой BlockReadразмер буфера (x) окажется меньше указанного произведения, то произойдёт следующее: если параметр numв вызовах процедур не указан, то произойдёт ошибка ввода-вывода; если указан, то ошибка не фиксируется, а после выполнения процедуры его значение не совпадёт с параметром count. По завершению процедур указатель смещается на num записей.

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

program createfile;

var buf: array[1..4] of real;

f_in: text;

f_out: file;

i, k: integer;

name_in, name_out: string;

begin

{$I-}

writeln(‘Введите имя входного файла: ‘);

readln(name_in);

assign(f_in, name_in);

reset(f_in);

if IOResult <> 0 then begin

writeln(‘Файл’, name_in, ‘ не найден’);

exit;

end;

writeln(‘Введите имя выходного файла: ‘);

readln(name_out);

assign(f_out, name_out);

rewrite(f_out, sizeof(real)*4);

{$I+}

i := 0;

while not eof(f_in) do begin

inc(i);

read(f_in, buf[i]);

if i = 4 then begin blockwrite(f_out, buf, 1); i := 0; end;

end;

if i <> 0 then begin

for k := i + 1 to 4 do buf[k] := 0;

blockwrite(f_out, buf, 1);

end;

close(f_in);

close(f_out);

end.

Truncate(varf) – процедура устанавливает в текущей позиции признак конца файла и удаляет все последующие элементы.

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

program get_bfile;

var buf: array[1..4] of real;

f: file;

i, k: integer;

filename: string;

begin

writeln(‘Введите имя файла: ‘);

readln(filename);

{$I-}

assign(f, filename);

reset(f, sizeof(real)*4);

if IOResult <> 0 then begin

writeln(‘Файл’, filename, ‘ не найден’);

exit;

end;

{$I+}

while true do begin

writeln(‘Введите номер записи или -1 для окончания’);

readln(k);

if (k > filesize(f)) or (k < 0) then begin

writeln(‘Такой записи нет’);

exit;

end;

seek(f, k);

blockread(f, buf, 1);

for i := 1 to 4 do write(buf[i]:6:1);

end;

close(f);

end.

Процедуры и функции.

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

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