Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Установка связи между файловой переменной и физическим внешним устройством




Процедура Assign (Var f; FileName: String) устанавливает связь между логическим файлом, описываемым файловой переменной f любого файлового типа, и конкретным файлом MS–DOS, название которого содержится в строковом параметре FileName. Иными словами, логический файл f связывается с физическим файлом FileName. Строка FileName может содержать имя файла на диске (в том числе полное имя файла), имя стандартного устройства MS–DOS (‘CON’, ‘PRN’ и т. п.) или пустую строку ‘’.

 

Assign (f, ‘file.dat’); {Связь с файлом текущего каталога}

Assign (f, ‘a: \ X.dat’); {Связь с файлом на диске а:}

Assign (f, ‘LPT1’); {Связь с принтером}

Assign (f, ‘’); {Связь со стандартным файлом, как правило, файлом ‘CON’}

 

Имя физического файла должно быть корректным и уникальным. Нельзя вставлять символы шаблонов ‘*’ и ‘?’ в имя файла, но можно связывать файловые переменные с еще не существующими файлами на диске (для дальнейшего их создания).

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

1.3. Понятие буфера ввода–вывода

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

Механизм буферизации позволяет более быстро и эффективно обмениваться информацией с различными устройствами. Для текстовых и бестиповых файлов можно устанавливать размер буфера по своему усмотрению.

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

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

 

Type f: File Of <Тип>.

 

Компонент может иметь любой ординарный или структурированный тип, предопределенный или построенный программистом. Запрещено лишь объявлять файлы файлов и файлы объектов, а также файлы структурированных компонентов (массивов, записей и др.), содержащих те же файлы или объекты.

Допустимы следующие объявления:

 

Type

Dim = Array [1..100, 1..2] of Real;

Zap = Record

x, y: Byte;

a: Dim;

End;

Df = File Of Dim;

Zf = File Of Zap;

 

Недопустимыми являются такие типы:

 

Type

ff1 = File Of File Of Real;

ff2 = File Of Df;

FZapF = Record

x, y: Byte;

f: File Of Char

End;

Zap = File Of FZapF;

 

При написании программ необязательно определять специальные файловые типы. Можно сразу описывать файловые переменные:

 

Var Fr: File Of Real; Fd: File Of Zap;

 

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

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

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

Reset (f);

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

Rewrite (f);

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

Процедура Close (f) закрывает файл. При создании нового или расширении старого файла процедура обеспечивает сохранение в файле всех новых записей и регистрацию файла в каталоге. Функции процедуры Close выполняются автоматически по отношению ко всем открытым файлам при нормальном завершении программы.

Для чтения данных из типизированного файла предназначена процедура

Read (f, <сп. ввода>);

где <сп. ввода> – список ввода, содержащий одну или более переменных такого же типа, что и компоненты файла (того же типа, что и тип в предложении File Of < тип >). Перед первым обращением к процедурам ввода–вывода указатель файла стоит в его начале и указывает на первый компонент с номе­ром 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Если этих переменных в списке несколько, указатель будет смещаться после каждой операции обмена данными.

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

Write (f, <сп. ввода>);

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

Функция Eof (f) возвращает результат типа Boolean: True, если считан последний компонент файла, и False – в противном случае. Файл f должен быть открыт.

Файл – это последовательная структура данных. Естественным способом доступа к компонентам файла является последовательный доступ. После открытия файла он “ждет” чтения или записи первого компонента. После каждого очередного обращения к файлу он готов выдать или принять очередной по счету компонент. Пусть нужно прочитать из файла f пятый элемент и записать его в переменную V соответствующего типа. Это можно сделать, считав “впустую” четыре первых значения:

 

Reset (f); For i:= 1 to 5 do Read (f, V); Writeln(V);

 

В V останется последнее, пятое, значение из файла. Это не самое удачное решение проблемы. Существуют встроенные процедуры и функции Турбо Паскаля для прямого доступа к компонентам файла.

Процедура Seek (f, <N компонента>)устанавливает номер текущего компонента файла f. Назначенный компонент будет считан или записан последующей операцией ввода–вывода. Эта процедура непосредственно реализует прямой доступ в файл.

Функция FilePos (f) возвращает номер текущего компонента. Результат типа Longint.

Функция Filesize (f) возвращает реальное число записей в открытом файле. Результат типа Longint.

Truncate (f)усекает файл f по текущему положению указателя.

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

 

Program Task1;

Uses CRT;

Var ct: File Of Integer;

{Объявили файловую переменную. Тип компоненты – Integer}

i, n, m: Integer;

Begin

Clrscr;

Assign (ct, ‘a:\int.dat’);

{Связали файловую переменную с файлом на диске А:}

Rewrite(ct); {Открываем новый файл}

Writeln(‘Сколько чисел будет записано в файл?’);

Readln(n); {Ввод количества элементов массива}

Write(ct, n); {Запись введенного числа на диск}

For i:= 1 To n Do {Цикл по количеству элементов в файле}

Begin

Readln(m); {Ввод целого числа с клавиатуры в оперативную память}

Write(ct, m); {Запись на диск в файл}

End;

Repeat Until keypressed; {Цикл задержки экрана – повторять,

пока не будет нажата какая-либо клавиша}

Close (ct); {Закрыть файл}

End.

 

Задача 2. Вывести на экран дисплея содержимое файла, сформиро­ванного в предыдущей программе.

 

Program Task2;

Uses CRT;

Var ct: File Of Integer;

i, n, m: Integer;

Begin

Clrscr;

Assign (ct, ‘a:\int.dat’);

Reset(ct);

Read(ct, n);

{Считали первый элемент файла – количество компонентов файла}

Writeln(‘Количество компонентов в файле = ‘,n);

For i:= 1 To n Do

Begin

Read(ct, m); {Считали информацию из файла}

Writeln(i, ‘-й компонент ‘, m); {Вывели информацию на экран}

End;

Repeat Until keypressed;

Close (ct);

End.





Поделиться с друзьями:


Дата добавления: 2016-11-18; Мы поможем в написании ваших работ!; просмотров: 2192 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

В моем словаре нет слова «невозможно». © Наполеон Бонапарт
==> читать все изречения...

2169 - | 2110 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.009 с.