Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Процедуры и функции для работы с файлами



Следующие процедуры открывают логический файл с файловой перемен­ной < ф.п.>, связанной ранее с уже существующим файлом:

RESET(< ф.п.> ) – для чтения,

REWRITE(< ф.п.> ) – для записи.

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

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

Процедура CLOSE(f) закрывает открытый ранее логический файл f и обеспечивает сохранение всех записей и регистрацию файла на диске. Вы­зовы процедуры CLOSE необходимы для завершения работы с файлами. Также необходимо закрывать открытые файлы перед их удалением (ERASE) или пе­реименованием (RENAME). При этом связь файла с файловыми переменными сох­раняется. Попытка закрыть уже закрытый файл или еще не открытый вызовет сбой в работе программы. Закрытие файлов выполняется автоматически по отношению ко всем открытым файлам при нормальном за­вершении программы.

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

 

Таблица 8

Общие процедуры и функции для работы с файлами

Процедуры и функции Выполняемые действия
Assign (f, name ) ReSet (f ) ReWrite (f ) Close (f ) Erase (f )   ReName (f, NewName )   EOF (f ) Связывает < ф.п.> fс именем файла name типа string Открывает файл с логическим именем f для чтения Открывает файл с логическим именем f для записи Закрывает файл с логическим именем f Удаляет (стирает) физический файл, связанный с f, с диска. Стираемый файл должен быть закрыт Переименовывает физический файл, связанный с < ф.п.> f, в файл с новым именем NewName Функция логического типа возвращает значение TRUE, если достигнут признак конца файла или файл пуст, иначе возвращает FALSE

При переименовании процедурой RENAME менять можно лишь имя файла, имя диска менять нельзя. Предварительно файл должен быть закрыт проце­дурой CLOSE.

Функция EOF(f) тестирует конец файла. Если она возвращает TRUE, при записи очередной компонент будет добавлен в конец файла, при чте­нии - файл считается исчерпанным.

 

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

Типизированные файлы позволяют организовать прямой доступ к каж­дой из компонент (по ее порядковому номеру), поскольку длина любого компонента типизированного файла строго постоянна. Описание файловой переменной для таких файлов выполняется в следующем виде:

Var < ф.п.> : file of < тип компонент>;

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

Для работы с типизированными файлами определены следующие проце­дуры и функции (табл. 9). Процедуру SEEK и функции FILESIZE, FILEPOS нельзя использовать для текстовых файлов.

Таблица 9

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

Процедуры, функции Выполняемые действия
READ(< ф.п.>, < список ввода> ); WRITE(< ф.п.>, < список вывода> );   SEEK(< ф.п.>, < номер_компоненты> )   FILESIZE(< ф.п.> );   FILEPOS(< ф.п.> ); Процедура обеспечивает чтение очередных ком­понентов файла Процедура используется для записи новых ком­понентов в файл; в качестве элементов вывода может стоять выражение. Процедура смещает указатель файла к компо­ненту с указанным номером; < номер_компоненты> – выражение типа Integer Функция возвращает количество компонент, содержащихся в файле Функция возвращает порядковый номер компо­ненты файла, доступной для чтения или записи

Чтобы переместить указатель в конец файла, можно написать, напри­мер: Seek(f, FileSize(f)); где f - файловая переменная.

Файловая переменная предварительно должна быть объявлена предло­жением FILE OF и связана с именем физического файла процедурой ASSIGN. Файл перед обращением к нему должен быть открыт.

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

Это файлы последовательного доступа. Они предназначены для хране­ния текстовой информации.

Текстовые файлы связываются с файловыми переменными типа TEXT:

Var < ф.п.> : TEXT;

Текстовый файл в Pascal ABC трактуется как совокупность строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой строки. При создании текстового файла в конце каждой строки ставится специальный признак EOLN (End Of LiNe - конец строки), а в конце всего файла – признак EOF (End Of File – конец файла) c кодом 26. Тестируются эти признаки одноименными логическими функциями.

Для доступа к записям текстового файла применяются процедуры RE­AD, READLN, WRITE, WRITELN. В них можно использовать переменное число параметров, в качестве которых могут быть символы, строки и числа. Первым параметром в любой из перечисленных процедур может стоять фай­ловая переменная. В этом случае осуществляется обращение к дисковому файлу, связанному с файловой переменной процедурой ASSIGN, и открытому процедурами RESET или REWRITE.

 

Процедуры ввода

Процедура READ обеспечивает ввод символов, строки и чисел. Она имеет следующий формат:

READ (< ф.п.>, < список_ввода> ); или READ( < список_ввода> );

где < список_ввода> - последовательность из одной или более переменных типа CHAR, STRING или любого целого или вещественного типов, например:

READ(Х); // ввод переменной Х с клавиатуры

READ(f, x1, x2, x3); // ввод трех переменных из файла

При вводе переменной типа CHAR выполняется чтение одного символа из файла и присваивается считанное значение переменной. Если перед чтением указатель файла достиг конца очередной строки, то считывается символ CR (код 13). Если достигнут конец файла - то символ EOF.

При вводе переменной типа STRING количество считанных символов равно максимальной длине строки, если раньше не встретились символы CR, EOF. В этом случае эти символы в строку не помещаются. Если коли­чество символов во входной строке больше максимального размера строки, то «лишние» символы до конца строки отбрасываются, а новое обращение к READ возвращает пустую строку.

Таким образом, READ не в состоянии прочесть последовательность строк: читается только одна строка, остальные окажутся пустыми. Для ввода последовательности строк символов применяется процедура READLN.

При вводе числовых данных процедура READ сначала выделяет подс­троку во входном потоке по следующему правилу: все ведущие пробелы, символы табуляции и маркеры конца строк пропускаются до первого знача­щего символа; и, наоборот, после первого значащего символа любой из перечисленных символов или символ EOF указывает на конец подстроки. Вы­деленная таким образом подстрока рассматривается как символьное представление числовой константы и присваивается переменной. Фактически весь файл рассматривается как одна длинная строка чисел.

Процедура READLN также обеспечивает ввод символов, строк и чисел:

READLN( f, x);

или READLN(f, x1, x2, ..., xN);

Она идентична процедуре READ за исключением того, что после счи­тывания последней переменной списка ввода оставшаяся часть строки до маркера EOLN пропускается, поэтому следующее обращение к READLN или READ начинается с первого символа новой строки.

Эту процедуру можно вызвать без параметра < список ввода>: READLN(f); READLN; что приведет к пропуску всех символов текущей строки. Таким способом можно организовать ожидание нажатия клавиши ENTER при открытом окне результатов.

При чтении с клавиатуры курсор помещается в начало следующей строки, в то время как в процедуре READ остается в текущей строке.

Процедуры вывода

Процедура WRITE обеспечивает вывод информации в файл или на экран дисплея. Существует две формы обращения к процедуре:

WRITE(< ф.п.>, < список_вывода> ); или WRITE(< список_вывода> );

где < список вывода> - это последовательность, состоящая из одной и более переменных (или вы­ражений) символьного, строкового, логического или любого целого или вещественного типа, например:

WRITE(x); WRITE(f, x1, x2, xN);

Файловая переменная, если она указана, должна быть предварительно описана типом TEXT и связана с именем файла процедурой ASSIGN. Если файловая переменная отсутствует, подразумева­ется вывод в стандартный файл – на экран дисплея.

Вывод процедурой WRITELN отличается от WRITE тем, что выводимая строка завершается кодами CR (возврат каретки) и LT (перевод строки), т. е. добавляет маркер конца строки.

При вызове WRITELN можно опускать < список_вывода>. В этом случае в файл передается признак конца строки EOLN, что при выводе на экран приводит к переводу курсора в начало следующей строки:

WRITELN(f); WRITELN;

Любой элемент X списка вывода для процедур WRITE/ WRITELN может быть представлен в следующем формате: X[: w[: d]], причем элементы, заключенные в квадратные скобки, мо­гут отсутствовать. Здесь X - имя переменной или выражение, w, d - вы­ражения целого типа WORD (0..65535). Если параметр w присутствует, то он указывает минимальную ширину поля для записи значения X. При длине переменной X меньше w слева производится дополнение поля вывода пробе­лами, если Х больше w, то w игнорируется и выводится необходимое число символов (по умолчанию w = 23); если параметр w не указан, то значение соответствующей переменной выводится вслед за предыдущим без како­го-либо разделения.

Параметр d задает количество десятичных знаков в дробной части вещественного числа. Используется только для вывода значений вы­ражений вещественных типов. Если параметр d не указан, то число выводится в экспоненциальной форме, в противном случае в формате представ­ления с фиксированной точкой. Если d = 0, выводится только целая часть числа. Например: результаты вывода для числа Х = 3.22 будут следующие:

WRITE(X: 6: 2); { 3.22}

WRITE(X: 6: 0); { 3}

WRITE(X: 4: 2); {3.22}.

Для текстовых файлов также применимы следующие процедуры и функции (табл. 10).

 

Таблица 10

Процедуры, функции Выполняемые действия
Append( f);   EOLN(f);     SeekEOLN(f);   SeekEOF(f); Процедура открывает уже существующий файл f для дозаписи в его конец (для расширения) Функция возвращает значение TRUE, если во входном файле f достигнуты маркеры конца строки EOLN или конца файла EOF, и FALSE - в противном случае Функция пропускает все пробелы и знаки табу­ляции до первого признака EOLN или первого значащего символа. Возвращает значение TRUE, если обнаружен маркер конца файла или конца строки Функция пропускает все пробелы, знаки табу­ляции и маркеры конца строк до маркера конца файла или первого значащего символа. Если мар­кер обнаружен, возвращает значение TRUE

Тексториентированные процедуры и функции

 

При выводе логических выражений в зависимости от значения выво­дятся подстроки TRUE и FALSE. Ввод логических констант процедурами RE­AD и READLN не предусмотрен.

10.7. Примеры и задания для работы с файлами

Пример 1. Написать программу, которая вводит с клавиатуры три вещественных числа и записывает эти числа и их сумму в файл FXD.DAT.

PROGRAM FileFD;

VAR

y, x1, x2, x3: real;

FD: TEXT;

BEGIN

ASSIGN(FD, 'FXD.DAT');

READ(x1, x2, x3); {ввод трех чисел}

REWRITE(FD); {открыть файл для записи}

y: = x1 + x2 + x3;

WRITELN(FD, ' x1=', x1, ' x2=', x2, ' x3=', x3); {вывод в файл x1, x2, x3}

WRITELN(FD, ' сумма = ', y); {вывод в файл суммы}

CLOSE(FD); {закрыть файл}

END.

Пример 2 . Вычислить суммы элементов в столбцах двумерного числового массива А[1..2, 1..4], заданного в файле FILE1.dat. Полученные значения поместить в файл FILE2.dat.

Для решения задачи разработана СА (рис. 16) и программа:

 
 

 


 

 

Program lr_11;

Var

a: array [1..2, 1..4] of integer;

s: array[1..4] of integer;

i, j: integer;

f1, f2: text; {объявление файловых переменных текстового типа}

Begin

ASSIGN(f1, ’FILE1.dat’); {связывание f1 с физическим файлом}

ASSIGN(f2, ’FILE2.dat’);

RESET(f1); {открыть файл для чтения}

for i: =1 to 2 do

for j: =1 to 4 do

Read(f1, a[i, j]); {чтение из файла, связанного с f1 }

CLOSE (f1); {закрыть файл, связанный с f1}

REWRITE (f2); {открыть файл для записи}

WRITELN (f2, ’ 1 2 3 4 - столбцы’); {вывод в файл через f2}

WRITELN (F2, ’суммы по столбцам); {вывод в файл через F2}

for j: =1 to 4 do

begin

s[j]: = 0;

for i: =1 to 2 do

s[j]: = s[j] + a[i, j];

write(f2, s[j]: 3) {вывод в файл через F2}

end;

CLOSE(F2) {закрыть файл, связанный с F2}

END.

Файл результатов

Исходный файл FILE2.dat

FILE1.dat 1 2 3 4 - столбцы

2 2 3 4 суммы по столбцам

5 2 3 4 7 4 6 8

 

Задания для самостоятельного выполнения

Задание 1

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

Задание 2

1. В текстовом файле Т1 записана последовательность целых чисел, разделенных пробелами. Написать программу, записывающую в текстовый файл Т2 все положительные числа из Т1.

2. В текстовом файле f1 записана последовательность чисел. Сформировать текстовый файл f 2, содержащий все числа в обратном порядке.

3. В текстовом файле Т1 записана последовательность чисел. Разработать программу, переписывающую в текстовый файл Т2 сначала все положительные числа из Т1, нуль, затем – все отрицательные числа.

4. В текстовом файле f 1 дана последовательность целых чисел, разделенных пробелами. Записать в текстовый файл F2 все положительные числа, а в файл F3 – отрицательные числа и нулевые элементы.

5. Сформировать файл из девяти строк, в первой из которых – одна единица, во второй – две двойки, …, в девятой – девять девяток.

6. Даны два файла F1, F2. Сформировать третий файл F, в который сначала записать все элементы файла F1, а затем – элементы файла F2.

7. Элементы каждого из заданных в двух файлах массивов X и Y упорядочены по возрастанию. Объединить элементы этих двух массивов в один файл F с упорядочением их по возрастанию.

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

9. В текстовом файле S1 записана последовательность из N*K чисел. Написать программу, формирующую в файле S2 матрицу из N строк по K чисел в каждой строке.

10. В файле W задан массив из девяти элементов. В новом файле WW сформировать массив, в котором каждому элементу будет присвоено значение соседнего с ним справа. Последнему элементу присвоить значение первого.

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

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

13. В файле X1 задана матрица целых чисел. Сформировать файл Х2, в котором все элементы с четными номерами строки и столбца матрицы заменить нулем (стереть).

14. В файле X задан массив из 20 чисел. Упорядочить его по возрастанию и занести в файл Y.

15. Задана в файле строка текста. Выполнить все циклические сдвиги слов в заданном тексте влево. Каждый полученный при этом текст вывести в другой файл.

16. В файле Y1 задана матрица вещественных чисел. Сформировать файл Y2, в котором строки матрицы упорядочены по убыванию элементов первого столбца.

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

18. Имеется текстовый файл BOOK. Написать программу, которая игнорирует исходное деление этого файла на строки, переформирует его, разбивая на строки так, чтобы каждая строка оканчивалась точкой либо содержала ровно 40 литер, если среди них нет точки.

19. Имеется текстовый файл T. Вывести в новый файл и напечатать первую из самых коротких его строк.

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

 


Поделиться:



Последнее изменение этой страницы: 2017-03-16; Просмотров: 782; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.067 с.)
Главная | Случайная страница | Обратная связь