Паскаль. М7.ppt
- Количество слайдов: 23
Программирование на языке Паскаль Модуль 7. Файлы 1
Файлы Файл – область памяти на внешнем запоминающем устройстве, хранящая (содержащая) определенную информацию. В эту область памяти можно помещать данные (операции ввода, записи), так и извлекать их оттуда (операции вывода, чтения) Какие файлы бывают вообще? Текстовые только текст без оформления, не содержат управляющих символов (с кодами < 32) ACSII (1 байт на символ) UNICODE (2 байта на символ) *. txt, *. log, *. html Двоичные могут содержать любые символы кодовой таблицы *. doc, *. bmp, *. wav, *. avi, Папки (каталоги) *. exe, *. jpg, *. mp 3, *. mpg 2
Файлы Использование файлов целесообразно в случае: 1. долговременного хранения данных ; 2. доступа различных программ к одним и тем же данным; 3. обработки больших массивов данных, которые невозможно целиком разместить в оперативной памяти компьютера. • В Паскале определены текстовые файлы, типизированные и нетипизированные. • Файл, не содержащий ни одного элемента, называется пустым. • Создается файл путем добавления новых записей в конец первоначально пустого файла. • Длина файла, т. е. количество элементов, не задается при определении файла.
Файлы Работа с файлами выполняется следующими процедурами: Assign – устанавливает связь между именем файла в программе (файловой переменной ) и физическим именем файла, принятым в ОС. Reset - открывает существующий файл для чтения. Rewrite – создает и открывает новый файл для записи на внешнем устройстве (если файл ранее существовал, вся предыдущая информация из него стирается). Close - закрывает открытый файл. Для определения конца файла используется стандартная встроенная функция EOF (файловая переменная), которая принимает значение True, если достигнут конец файла, и значение False в противном случае.
Принцип сэндвича Переменная типа "текстовый файл": var f: text; I этап. открыть файл : • связать переменную f с файлом assign(f, 'qq. dat'); • открыть файл (сделать его активным, приготовить к работе) reset(f); {для чтения} rewrite(f); {для записи} II этап: работа с файлом read ( f, n ); { ввести значение n } write ( f, n ); { записать значение n } writeln ( f, n ); {c переходом на нов. строку } III этап: закрыть файл close(f); 5
Работа с файлами Особенности: • имя файла упоминается только в команде assign, обращение к файлу идет через файловую переменную • файл, который открывается на чтение, должен существовать • если файл, который открывается на запись, существует, старое содержимое уничтожается • данные записываются в файл в текстовом виде • при завершении программы все файлы закрываются автоматически • после закрытия файла переменную f можно использовать еще раз для работы с другим файлом 6
Работа с файлами Особенности текстовых файлов: • Текстовые файлы внутренне разделены на строки, длины которых различны. Для разделения строк используется специальный маркер конца строки. • Объявляются текстовые файлы переменной типа text. Обрабатывать их можно только последовательно и с помощью процедур и функций: • Readln (f , st )- чтение строки st из файла f и переход на начало следующей ; • Writeln (f, st )- запись строки st в файл f и маркера конца строки ; • Append (f ) - процедура, открывающая файл f для добавления строк в конец файла; • Eoln (st ) - логическая функция, результат выполнения которой 7 равен TRUE, если достигнут маркер конца строки st.
Последовательный доступ • при открытии файла курсор устанавливается в начало assign ( f, 'qq. dat' ); reset ( f ); 12 5 45 конец файла (end of file, EOF) 67 56● • чтение выполняется с той позиции, где стоит курсор • после чтения курсор сдвигается на первый непрочитанный символ read ( f, x ); 12 5 45 67 56● 8
Последовательный доступ • чтение до конца строки readln ( f, x ); конец строки (end of line, EOL) 12 5 45¤ 36 67¤ 56● • как вернуться назад? close ( f ); reset ( f ); { начать с начала } 9
Пример Задача: в файле input. txt записаны числа (в столбик), сколько их – неизвестно. Записать в файл output. txt их сумму. ? Можно ли обойтись без массива? Алгоритм: 1. Открыть файл input. txt для чтения. 2. S : = 0; 3. Если чисел не осталось, перейти к шагу 7. 4. Прочитать очередное число в переменную x. 5. S : = S + x; 6. Перейти к шагу 3. цикл с условием "пока есть данные" 7. Закрыть файл input. txt. 8. Открыть файл output. txt для записи. 9. Записать в файл значение S. 10. Закрыть файл output. txt. 10
Программа program qq; var s, x: integer; f: text; begin assign(f, 'input. txt'); reset(f); s : = 0; while not eof(f) do begin readln(f, x); s : = s + x; end; close(f); логическая функция, возвращает True, если достигнут конец файла запись результата в файл output. txt assign(f, 'output. txt'); rewrite(f); writeln(f, 'Сумма чисел ', s); close(f); end. 11
Обработка массивов Задача: в файле input. txt записаны числа (в столбик), сколько их – неизвестно, но не более 100. Переставить их в порядке возрастания и записать в файл output. txt. ? Можно ли обойтись без массива? Проблемы: 1. для сортировки надо удерживать в памяти все числа сразу (массив); 2. сколько чисел – неизвестно. Решение: 1. выделяем в памяти массив из 100 элементов; 2. записываем прочитанные числа в массив и считаем их в переменной N; 3. сортируем первые N элементов массива; 4. записываем их в файл. 12
Чтение данных в массив Глобальные переменные: var A: array[1. . 100] of integer; f: text; Функция: ввод массива, возвращает число элементов function Read. Array: integer; var i: integer; begin assign(f, 'input. txt'); reset(f); i : = 0; цикл заканчивается, если достигнут конец файла или прочитали 100 чисел while (not eof(f)) and (i < 100) do begin i : = i + 1; readln(f, A[i]); end; close(f); Read. Array : = i; end; 13
Программа program qq; var A: array[1. . 100] of integer; f: text; N: integer; function Read. Array: integer; . . . end; Begin N : = Read. Array; { сортировка первых N элементов } assign(f, 'output. dat'); rewrite(f); for i: =1 to N do writeln(f, A[i]); close(f); end. вывод отсортированного массива в файл 14
Обработка текстовых данных Задача: в файле input. txt записаны строки, в которых есть словопаразит "короче". Очистить текст от мусора и записать в файл output. txt. Файл input. txt : Мама, короче, мыла, короче, раму. Декан, короче, пропил, короче, бутан. А роза, короче, упала на лапу, короче, Азора. Каждый, короче, охотник желает, короче, знать, где. . . Результат - файл output. txt : Мама мыла раму. Декан пропил бутан. А роза упала на лапу Азора. Каждый охотник желает знать, где сидит фазан. 15
Обработка текстовых данных Алгоритм: пока не кончились данные 1. Прочитать строку из файла (readln). 2. Удалить все сочетания ", короче, " (Pos, Delete). 3. Перейти к шагу 1. Обработка строки s: искать ", короче, " repeat удалить 9 символов i : = Pos(', короче, ', s); if i <> 0 then Delete(s, i, 9); until i = 0; Особенность: надо одновременно держать открытыми два файла (один в режиме чтения, второй – в режиме записи). 16
Работа с двумя файлами одновременно program qq; var s: string; файловые переменные i: integer; f. In, f. Out: text; открыть файл для чтения begin assign(f. In, 'input. txt'); открыть файл reset(f. In); для записи assign(f. Out, 'output. txt'); rewrite(f. Out); { обработать файл } close(f. In); close(f. Out); end. 17
Полный цикл обработки файла пока не достигнут конец файла while not eof(f. In) do begin readln(f. In, s); обработка строки repeat i : = Pos(', короче, ', s); if i <> 0 then Delete(s, i, 9); until i = 0; writeln(f. Out, s); end; запись "очищенной" строки 18
Типизированные файлы – это файлы, состоящие из нумерованной последовательности объектов (записей) любого типа. С такими файлами можно работать в режиме прямого доступа, при котором выполняется непосредственное об ращение к любой записи файла. Каждая запись файла имеет свой номер, начиная с 0 и т. д. 19
Типизированные файлы Процедуры и функции обработки файлов типизорованных: 1) Write и Read- записывают и читают информацию из указанного файла и перемещают указатель файла к сле дующей записи. 2) Seek (файловая переменная, номер записи); процедура перемещения указателя на запись файла с заданным номером. 3) Truncate (файловая переменная); процедура, усекающая файл по текущей позиции указа теля файла, т. е. все записи, находящиеся после указателя фай ла, удаляются. 4) Функция Filesize (файловая переменная); имеет тип Integer и определяет размер файла, т. е. число записей. 5) Функция Filepos (файловая переменная); имеет тип Integer и возвращает текущую позицию указателя файла. 20
Типизированные файлы Для добавления записей в конец файла используются процедуры: Readln (a ); Seek (f, filesize (f)); Write (f, a); При этом указатель устанавливается за конец файла, т. к. нумерация записей начинается с нуля. После чего с помощью Write можно добавлять записи. Открывать файл можно только процедурой Reset (f). Для того, чтобы в режиме произвольного доступа считать, а затем изменить значение записи, следует выполнить два вы зова процедуры Seek. Один вызов перед операцией Read, а другой - перед операцией Write (т. к. Read после чтения записи 21 переместит указатель к следующей записи).
Отличия текстовых файлов от типизированных Текстовые файлы в отличие от типизированных имеют ряд преимуществ: 1. Созданный программно текстовый файл можно открыть любым текстовым редактором и посмотреть, что в нём. Если же попытаться сделать это с типизированным файлом, то мы увидим лишь нечитабельные значки-коды. 2. Возможность дозаписи в конец файла - оператор Append(f). Этот оператор существует ТОЛЬКО для текстовых файлов. 22
Отличия текстовых файлов от типизированных Недостатки текстовых файлов. Пусть нам надо отправить в файл, а затем считать из файла числовой массив А. Если файл типизированный, то можно просто пользоваться операторами Write(f, A[i]) и Read(f, A[i]) - никаких проблем не возникнет. А вот если файл объявлен текстовым, то все числа будут записаны "сплошняком", без пробелов, и считать массив будет уже невозможно. Потому в этом случае необходимо озаботиться принудительной записью пробелов между числами 23