Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Yazyk_Turbo-Paskal.doc
Скачиваний:
17
Добавлен:
15.04.2015
Размер:
754.69 Кб
Скачать

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

Составить программу чтения вещественных чисел из текстового файла FLOAT.DAT, и запись тех из них, которые не превышают по модулю 9999, в новый текстовый файл INTEGER.DAT в табличной форме, по 10 чисел (округленных до ближайшего целого), в каждой записи. Файл с данными находится в текущем каталоге. По завершении работы файл FLOAT.DAT переименовать в REAL.DAT.

PROGRAM Example;

CONST

MAX=9999.0;

K : integer = 0; { счетчик выведенных чисел }

VAR

X :real;

Fin,Fout : text;

BEGIN

{$I- } {Отключение завершения программы по ошибке операций с файлом }

Assign(Fin,'FLOAT.DAT');

Reset(Fin); { открытие входного файла }

{$I+ } { Включение стандартного контроля ошибок операций с файлом }

if IOResult=0 then {если файл найден и открыт успешно }

begin

Assign(Fout,'INTEGER.DAT');

Rewrite(Fout); { открытие выходного файла }

while not Eof(Fin) do { пока не достигнут конец входного файла }

begin

Read(Fin,X);

if Abs(X)<MAX then

begin

Write(Fout,Round(X):5);

K:=K+1;

if K mod 10 = 0 then Writeln(Fout); { переход на новую запись

после каждого десятого выведенного числа }

end;

end;

Close(Fout); { закрытие обоих файлов }

Close(Fin);

Rename(Fin,'REAL.DAT'); { переименование входного файла }

end

else { еcли входной файл не найден }

Writeln(' Не удалось окрыть файл FLOAT.DAT');

END.

Двоичные файлы (в машинных кодах) Типизированные файлы

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

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

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

Read(F,<список ввода>) - чтение данных из файла с занесением информации в переменные списка ввода. Все переменные должны быть одного типа, совпадающего с типом файла.

Seek(F,Num) - поиск записи с номером Num.

Truncate(F) - удаление части файла от текущей записи до конца.

Write(F,<список вывода>) - вывод данных в файл. Все элементы списка должны иметь тип, совпадающий с типом файла.

Функции при работе с типизированными файлами

FilePos(F) - возвращает целочисленный номер текущей записи файла. Нумерация начинается с нуля.

FileSize(F) - возвращает целочисленный текущий размер файла, но не в байтах, а в записях.

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

Написать программу чтения из типизированного файла STUDENTS.BSF учетной информации о студентах (содержащей фамилию, номер курса, название группы и средний балл за последнюю сессию), создающую новый файл BAD_STUD.BSF со списком студентов - кандидатов на отчисление с первого курса (у которых средний балл ниже или равен 3.3), и исключающую из исходного списка документы о студентах, со средним баллом ниже 2.7.

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

PROGRAM Example;

TYPE

Document = record {запись основного списка}

Name : string[20];

Kurs : 0..6;

Groop: string[4];

Ball : real;

End;

Kandidat = record {запись списка кандидатов на отчисление}

Name : string[20];

Groop: string[4];

End;

CONST

EMPTY : Document = {запись пустого документа - вакансии}

( Name : 'Вакансия';

Kurs : 1;

Groop: '0000';

Ball : 0.0

);

BAD_BALL = 3.3; {верхний предел балла кандидата на отчисление}

VERY_BAD_BALL = 2.7; {верхний предел балла отчисленного студента}

VAR

Student : Document; {переменная для чтения из входного файла} BadStudent : Kandidat; {переменная для записи в выходной список }

i,j,k : integer;

Fin : file of Document; {исходный файл документов студентов}

Fout : file of Kandidat; {создаваемый файл списка кандидатов }

BEGIN

Assign (Fin,'STUDENT.DAT');

Reset (Fin); {открытие исходного файла документов }

Assign (Fout,'BAD_STUD.DAT');

Rewrite(Fout); {открытие нового файла для списка }

i:=0; { i - старый номер студента в исходном файле }

j:=0; { j - новый номер студента в исходном файле после исключений }

while not SeekEof(Fin) do { пока не достигли конца файла }

begin

Seek(Fin,i); { выбираем очередной номер из исходного файла }

Read(Fin,Student); { и считываем его в рабочую структуру }

if Student.Ball > VERY_BAD_BALL then {если балл выше критерия

на отчисление }

begin

Seek(Fin,j); { ищем, куда этот документ надо записать в }

Write(Fin,Student); { исходный файл и записываем }

j:=j+1; { подсчет оставленных студентов

if Student.Ball < BAD_BALL then { если балл оставленного студента ниже критерия предупреждения }

begin

BadStudent.Name := Student.Name; { формируем элемент } BadStudent.Groop := Student.Groop; { списка кандидатов }

Write(Fout, BadStudent); { и выводим очередную запись в файл }

end;

end;

i:=i+1; { подсчет просмотренных документов студентов }

end;

Close(Fout); { закрыли файл со списком кандидатов }

if i>j then { если кого-то исключили }

for k:=j+1 to i do { начиная со следующего документа за последним }

begin { оставленным студентом и до конца файла }

Seek(Fin,k) { подводим указатель на нужное место в файле }

Write(Fin, EMPTY); { и записываем туда пустой документ - вакансию } end;

Close(Fin); { закрытие исправленного исходного файла документов }

END.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]