Что представляет собой типизированный файл

Что представляет собой типизированный файл

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

type toy = record name: string[20]; price: real; age: set of 0..18; <в файле задано границами>end;

то придется написать следующий код:

var f: text; c: char; i,j,min,max: integer; a: array[1..100] of toy;begin assign(f,input); reset(f); for i:=1 to 100 do if not eof(f) then with a[i] do begin readln(f,name,price,min,max); age:=[]; for j:= min to max do age:=age+[j]; end; close(f); . end.

Как видим, такое поэлементное считывание весьма неудобно и трудоемко.

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

Описание типизированных файлов

В разделе var файловые переменные, предназначенные для работы с типизированными файлами, описываются следующим образом:

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

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

С этого момента и до конца раздела под словом "файл" мы будем подразумевать "бинарный типизированный файл" (разумеется, если специально не оговорено иное).

Команда assign(f,’ ‘); служит для установления связи между файловой переменной f и именем того файла, за работу с которым эта переменная будет отвечать.

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

Открытие и закрытие типизированного файла

В зависимости от того, какие действия ваша программа собирается производить с открываемым файлом, возможно двоякое его открытие:

reset(f); — открытие файла для считывания из него информации и одновременно для записи в него (если такого файла не существует, попытка открытия вызовет ошибку). Эта же команда служит для возвращения указателя на начало файла;

rewrite(f); — открытие файла для записи в него информации; если такого файла не существует, он будет создан; если файл с таким именем уже есть, вся содержавшаяся в нем ранее информация исчезнет.

Закрываются типизированные файлы процедурой close(f), общей для всех типов файлов.

Считывание из типизированного файла

Чтение из файла, открытого для считывания, производится с помощью команды read(). В скобках сначала указывается имя файловой переменной, а затем — список ввода:

read(f,a,b,c); — читать из файла f три однотипные переменные a, b и c.

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

type toy = record name: string[20];

var f: file of toy;

a: array[1..100] of toy;

for i:=1 to 100 do

if not eof(f) then read(f,a[i]);

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

Уже знакомая нам функция eof(f:file):boolean сообщает о достигнутом конце файла. Все остальные функции "поиска конца" (eoln(), seekeof() и seekeoln()), свойственные текстовым файлам, нельзя применять к файлам типизированным.

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

1. Функция filepos(f:file):longint сообщит текущее положение указателя в файле f. Если он указывает на самый конец файла, содержащего N элементов, то эта функция выдаст результат N. Это легко объяснимо: элементы файла нумеруются начиная с нуля, поэтому последний элемент имеет номер N-1. А номер N принадлежит, таким образом, "несуществующему" элементу — признаку конца файла.

Читайте также:  Sony bdp s6500 прошивки

2. Функция filesize(f:file):longint вычислит длину файла f.

3. Процедура seek(f:file,n:longint) передвинет указатель в файле f на начало записи с номером N. Если окажется, что n больше фактической длины файла, то указатель будет передвинут и за реальный конец файла.

4. Процедура truncate(f:file) обрежет "хвост" файла f: все элементы начиная с текущего и до конца файла будут из него удалены. На самом же деле произойдет лишь переписывание признака "конец файла" в то место, куда указывал указатель, а физически "отрезанные" значения останутся на прежних местах — просто они станут "бесхозными".

Запись в типизированный файл

Сохранять переменные в файл, открытый для записи, можно при помощи команды write(). Так же как и в случае считывания, первой указывается файловая переменная, а за ней — список вывода:

write(f,a,b,c); — записать в файл f (предварительно открытый для записи командами rewrite(f) или reset(f)) переменные a,b,c.

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

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

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

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

А что произойдет, если в файле содержится всего N элементов, а запись производится в (N+k)-й? Тогда начало файла останется прежним, затем в файл будет включен весь тот "мусор", что оказался между его концом и записываемой переменной, и, наконец, последним элементом нового файла станет записанное значение.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Студент — человек, постоянно откладывающий неизбежность. 11389 — | 7618 — или читать все.

10. Текстовые файлы, типизированные, нетипизированные файлы.

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

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

Write(f, список переменных);

Процедура записывает в файл f всю информацию из списка переменных.

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

Read(f, список переменных);

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

Смещение указателя файла:

Процедура смещает указатель файла f на n-ную позицию. Нумерация в файле начинается с 0.

Определение количества компонент:

Функция возвращает количество компонент в файле f.

Определение позиции указателя:

Функция возвращает порядковый номер текущего компонента файла f.

Отсечение последних компонент файла:

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

Работа с текстовыми файлами

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

Чтение из текстового файла:

Читайте также:  Как закинуть деньги на стим через телефон

Read(f, список переменных);

ReadLn(f, список переменных);

Процедуры читают информацию из файла f в переменные. Способ чтения зависит от типа переменных, стоящих в списке. В переменную char помещаются символы из файла. В числовую переменную: пропускаются символы-разделители, начальные пробелы и считывается значение числа до появления следующего разделителя. В переменную типа string помещается количество символов, равное длине строки, но только в том случае, если раньше не встретились символы конца строки или конца файла. Отличие ReadLn от Read в том, что в нем после прочтения данных пропускаются все оставшиеся символы в данной строке, включая метку конца строки. Если список переменных отсутствует, то процедура ReadLn(f) пропускает строку при чтении текстового файла.

Запись в текстовый файл:

Write(f, список переменных);

WriteLn(f, список переменных);

Процедуры записывают информацию в текстовый файл. Способ записи зависит от типа переменных в списке (как и при выводе на экран). Учитывается формат вывода. WriteLn от Write отличается тем, что после записи всех значений из переменных записывает еще и метку конца строки (формируется законченная строка файла).

Добавление информации к концу файла:

Процедура открывает текстовый файл для добавления информации к его концу. Используйте эту процедуру вместо Rewrite.

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

Нетипизированные файлы — это последовательность компонент произвольного типа.

Открытие нетипизированного файла:

Параметр BufSize задает число байтов, считываемых из файла или записываемых в него за одно обращение. Минимальное значение BufSize — 1 байт, максимальное — 64 К байт. Если BufSize не указан, то по умолчанию он принимается равным 128.

Чтение данных из нетипизированного файла:

BlockRead(f, X, Count, QuantBlock);

Эта процедура осуществляет за одно обращение чтение в переменную X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера. Значение Count не может быть меньше 1. За одно обращение нельзя прочесть больше, чем 64 К байтов.

Необязательный параметр QuantBlock возвращает число блоков, прочитанных текущей операцией BlockRead. В случае успешного завершения операции чтения QuantBlock = Count, в случае аварийной ситуации параметр QuantBlock будет содержать число удачно прочитанных блоков. Отсюда следует, что с помощью параметра QuantBlock можно контролировать правильность выполнения операции чтения.

Запись данных в нетипизированный файл:

BlockWrite(f, X, Count, QuantBlock);

Эта процедура осуществляет за одно обращение запись из переменной X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера.

Необязательный параметр QuantBlock возвращает число блоков, записанных успешно текущей операцией BlockWrite.

Для нетипизированных файлов можно использовать процедуры Seek, FIlePos и FileSize, аналогично соответствующим процедурам типизированных файлов.

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

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

возвращает целое число, соответствующее коду последней ошибки ввода — вывода. При нормальном завершении операции функция вернет значение 0. Значение функции IOResult необходимо присваивать какой-либо переменной, так как при каждом вызове функция обнуляет свое значение. Функция IOResult работает только при выключенном режиме проверок ошибок ввода — вывода или с ключом компиляции <$I->.

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

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

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

Читайте также:  Задачи на проценты банк

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

Для описания типизированных файловых переменных применяются зарезервированные слова file of, например:

F1: File of string [50];

F2: File of integer;

F3: File of real;

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

Assign(F1,’d:homestud17miras
ame.pas’);

2. Процедура Reset –открывает файл уже существующий на диске. Текущая позиция устанавливается в начало файла.

Описание: Reset (F);

3. Процедура Rewrite –создает и открывает файл. Если файл уже существует, то он уничтожается и создается заново.

Описание: Rewrite (F);

4. Процедура Read – прочитать значения указанных переменных из файла.

Описание: Read (F, X1[,X2[,X3[..XN]]]);

F – типизированная файловая переменная

X1..XN – переменные того же типа, что и компоненты файла.

5. Процедура Write –записать значения указанных переменных в файл.

Описание: Write (F, X1[,X2[,X3[..XN]]]);

F – типизированная файловая переменная

X1..XN – переменные того же типа, что и компоненты файла.

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

6. Функция FilePos– возвращает порядковый номер текущего компонента файла. Файл должен быть открыт. Если текущей позицией является начало файла, то функция возвращает значение 0. При переходе от элемента к элементу его значение увеличивается на 1. Эту функцию нельзя использовать в текстовых файлах.

Описание: FilePos(F): LongInt; (-2 147 483 648 – 2 147 483 647).

7. Функция FileSize — возвращает количество компонентов файла. Если файл пуст, то возвращается значение 0.

Описание: FileSize(F): LongInt;

8. Процедура Seek –позиционирует указатель файла на заданный компонент файла.

Описание: Seek (F, L: LongInt);

F –файловая переменная,L –номер компонента, на который будет позиционирован указатель.

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

Описание: Truncate(F);

Пример:

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

filtyp = file of integer;

sum, mult, r, k1, k2, max: integer;

writeln(‘введите элементы файла по одному в строке, в конце — 0’);

// записываем в файл числа, вводимые с клавиатуры до 0

if r <> 0 then write (f,r);

// позиционируем указатель на 0-ой элемент, т.е на начало файла

// считываем из файла 1-ый элемент, указатель сдвигается вправо на

// заносим его значение в max для нахождения наибольшего значения

// сдвигаем указатель влево на 1 позицию

// считываем элементы, суммируем, перемножаем и отыскиваем max

while not eof(f) do

| следующая лекция ==>
Лекция №19. Текстовые файлы. Процедуры и функции для обработки текстовых файлов | Лекция № 22. Динамические переменные. Ссылочные типы

Дата добавления: 2017-11-04 ; просмотров: 622 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Ссылка на основную публикацию
Что можно достать из старого монитора
Ребята, мы вкладываем душу в AdMe.ru. Cпасибо за то,что открываете эту красоту. Спасибо за вдохновение и мурашки.Присоединяйтесь к нам в...
Что делать если экран компьютера уменьшился
В этом уроке я покажу, как уменьшить масштаб экрана на компьютере. Мы научимся изменять шрифт в Windows разными способами: через...
Что делать когда dns сервер не отвечает
Как настроить роутер, как настроить модем, как настроить оптический терминал. Настройка роутера по http://192.168.1.1 или http://192.168.0.1 DNS сервер не отвечает...
Что можно писать на javascript
Аспирант Нетологии Максим Пименов рассказывает про JavaScript — невероятно популярный язык программирования, который учит сайты реагировать на поведение посетителей. JavaScript...
Adblock detector