Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Процедуры и функции для работы с файлами
Следующие процедуры открывают логический файл с файловой переменной < ф.п.>, связанной ранее с уже существующим файлом: RESET(< ф.п.> ) – для чтения, REWRITE(< ф.п.> ) – для записи. Только после открытия файла становится возможным чтение и запись данных. При их выполнении переменная-указатель, связанная с файлом, будет указывать на начало этого файла, т.е. на компонент с номером нуль. Процедуры открытия могут применяться многократно к одному и тому же файлу. Если файл был до этого открыт, то он автоматически предварительно закрывается. Повторный вызов RESET переустановит последовательность чтения вновь на самый первый элемент файла (потеря данных исключена). Но повторное обращение в REWRITE сотрет текущее содержимое файла и подготовит файл к заполнению, начиная с первого элемента. Процедура CLOSE(f) закрывает открытый ранее логический файл f и обеспечивает сохранение всех записей и регистрацию файла на диске. Вызовы процедуры CLOSE необходимы для завершения работы с файлами. Также необходимо закрывать открытые файлы перед их удалением (ERASE) или переименованием (RENAME). При этом связь файла с файловыми переменными сохраняется. Попытка закрыть уже закрытый файл или еще не открытый вызовет сбой в работе программы. Закрытие файлов выполняется автоматически по отношению ко всем открытым файлам при нормальном завершении программы. В таблице 8 сведены общие процедуры и функции для работы с файлами, наиболее применимые на практике.
Таблица 8 Общие процедуры и функции для работы с файлами
При переименовании процедурой RENAME менять можно лишь имя файла, имя диска менять нельзя. Предварительно файл должен быть закрыт процедурой CLOSE. Функция EOF(f) тестирует конец файла. Если она возвращает TRUE, при записи очередной компонент будет добавлен в конец файла, при чтении - файл считается исчерпанным.
Типизированные файлы Типизированные файлы позволяют организовать прямой доступ к каждой из компонент (по ее порядковому номеру), поскольку длина любого компонента типизированного файла строго постоянна. Описание файловой переменной для таких файлов выполняется в следующем виде: Var < ф.п.> : file of < тип компонент>; Перед первым обращением к процедурам ввода-вывода указатель файла стоит в его начале и указывает на компоненту с номером нуль. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Переменные в списках ввода-вывода должны иметь тот же тип, что и компоненты файла. Если этих переменных в списке несколько, указатель будет смещаться после каждой операции обмена данными между переменными и дисковым файлом. Для работы с типизированными файлами определены следующие процедуры и функции (табл. 9). Процедуру SEEK и функции FILESIZE, FILEPOS нельзя использовать для текстовых файлов. Таблица 9 Процедуры и функции для работы с типизированными файлами
Чтобы переместить указатель в конец файла, можно написать, например: Seek(f, FileSize(f)); где f - файловая переменная. Файловая переменная предварительно должна быть объявлена предложением FILE OF и связана с именем физического файла процедурой ASSIGN. Файл перед обращением к нему должен быть открыт. Текстовые файлы Это файлы последовательного доступа. Они предназначены для хранения текстовой информации. Текстовые файлы связываются с файловыми переменными типа TEXT: Var < ф.п.> : TEXT; Текстовый файл в Pascal ABC трактуется как совокупность строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой строки. При создании текстового файла в конце каждой строки ставится специальный признак EOLN (End Of LiNe - конец строки), а в конце всего файла – признак EOF (End Of File – конец файла) c кодом 26. Тестируются эти признаки одноименными логическими функциями. Для доступа к записям текстового файла применяются процедуры READ, 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
Тексториентированные процедуры и функции
При выводе логических выражений в зависимости от значения выводятся подстроки TRUE и FALSE. Ввод логических констант процедурами READ и 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; Нарушение авторского права страницы