![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Особенности работы с текстовыми файламиСодержание книги
Поиск на нашем сайте
Для работы с текстовым файлом файловая переменная описывается стандартным описателем Text: VAR F1,F2:Text; Дополнительно к процедурам открытия Reset и Rewrite можно использовать процедуру Append, которая позволяет записывать данные в конец существующего файла. В качестве параметров, передаваемых процедуре записи Write или Writeln, могут использоваться списки выражений, которые вычисляются перед выводом и, затем выводятся в файл F, возможно с использованием форматов вывода. В качестве параметров, передаваемых процедурам чтения Read или Readln должны быть имена простых переменных, переменных с индексом или строк. Количество параметров может быть любым, в том числе нулевым. Если в операторах отсутствует имя файла, транслятор подставляет стандартные имена Input (для ввода) и Output (для вывода). Эти файлы автоматически открываются и закрываются при завершении программы. Текстовые файлы, из которых производится чтение числовых данных, должны содержать числовые значения, разделенные пробелами, знаками табуляции или символами конца строки. При вводе из файла данных в символьные переменные считывается по одному символу, в том числе - разделители, символ возврата каретки и символ перевода строки. При чтении данных в строковые переменные, из файла выбирается столько символов, сколько объявлено при описании строковой переменной, однако, если достигается конец записи, строка заполняется не полностью. Переход на чтение новой записи файла (уже в другую строчную переменную!) выполнится только на новом операторе чтения, причем он должен быть Readln. Ниже приводятся процедуры и функции, используемые при работе с текстовыми файлами, дополнительно к приведенным ранее. Процедуры Append(F) - открытие существующего файла для дозаписи в конец. Flush(F) - немедленное освобождение буфера в выводной файл. Обычно физическое выполнение записи в файл осуществляется по заполнении буфера или по команде Close. Read(F,<список ввода>) - чтение из файла начиная с текущего положения в переменные списка. Readln(F,<список ввода>) - чтение из файла начиная с текущего положения в переменные списка. После чтения - переход на начало новой записи файла. SetTextBuf(F,Buf,Size) - назначение в качестве буфера ввода/вывода для файла F переменной Buf (обычно какого-либо массива или строки). Если опущен необязательный параметр Size - используется вся память, занятая переменной Buf. Если процедуры нет, используется стандартный буфер длиной 128 байт.
Write(F,<список вывода>) - вывод данных в файл, начиная с текущего места в записи. Writeln(F,<список вывода>) - вывод данных в файл, начиная с текущего места в записи. По окончании операции, переход на начало новой записи. Функции Eoln(F) - признак конца строки. Возвращает TRUE, если текущий указатель во входном файле достиг конца записи или конца файла, иначе возвращает значение FALSE. SeekEof(F) - признак конца файла. Отличается от Eof(F) тем, что пропускает символы пробела и табуляции, стоящие в конце строки. SeekEoln(F) - признак конца строки. Отличается от Eoln(F) тем, что пропускает символы пробела и табуляции, стоящие в конце строки. Пример работы с текстовыми файлами.
Составить программу чтения вещественных чисел из текстового файла FLOAT.DAT, и запись тех из них, которые не превышают по модулю 9999, в новый текстовый файл INTEGER.DAT в табличной форме, по 10 чисел (округленных до ближайшего целого), в каждой записи. Файл с данными находится в текущем каталоге. По завершении работы файл FLOAT.DAT переименовать в REAL.DAT. PROGRAM Example; CONST MAX=9999.0; K: integer = 0; { счетчик выведенных чисел } VAR X:real; Fin,Fout: text; BEGIN {$I- } {Отключение завершения программы по ошибке операций с файлом } Assign(Fin,'FLOAT.DAT'); Reset(Fin); { открытие входного файла } {$I+ } { Включение стандартного контроля ошибок операций с файлом } if IOResult=0 then {если файл найден и открыт успешно } Begin Assign(Fout,'INTEGER.DAT'); Rewrite(Fout); { открытие выходного файла } while not Eof(Fin) do { пока не достигнут конец входного файла } Begin Read(Fin,X); if Abs(X)<MAX then Begin Write(Fout,Round(X):5); K:=K+1; if K mod 10 = 0 then Writeln(Fout); { переход на новую запись после каждого десятого выведенного числа } end; end; Close(Fout); { закрытие обоих файлов } Close(Fin); Rename(Fin,'REAL.DAT'); { переименование входного файла } End else { еcли входной файл не найден } Writeln(' Не удалось окрыть файл FLOAT.DAT'); END. Двоичные файлы (в машинных кодах) Типизированные файлы Типизированный файл состоит из записей одного типа, причем для описания записей файла может использоваться любой тип, кроме файла и типа-объекта. В отличие от текстовых, с типизированными файлами можно работать как с последовательными, так и с файлами прямого доступа. При вводе и выводе не производится преобразований из внутримашинного представления данных в символьный вид и обратно. Это ускоряет работу с файлами. Если в записи файла присутствуют строки, их размер должен быть рассчитан на длину максимальной встречающейся строки, причем в записях неиспользуемые байты строки все равно присутствуют. За счет этого, размер типизированного файла будет больше текстового файла с той же информацией.
Ниже приводятся процедуры и функции, используемые при работе с типизированными файлами, дополнительно к общим, приведенным ранее. Процедуры при работе с типизированными файлами
Read(F,<список ввода>) - чтение данных из файла с занесением информации в переменные списка ввода. Все переменные должны быть одного типа, совпадающего с типом файла. Seek(F,Num) - поиск записи с номером Num. Truncate(F) - удаление части файла от текущей записи до конца. Write(F,<список вывода>) - вывод данных в файл. Все элементы списка должны иметь тип, совпадающий с типом файла. Функции при работе с типизированными файлами FilePos(F) - возвращает целочисленный номер текущей записи файла. Нумерация начинается с нуля. FileSize(F) - возвращает целочисленный текущий размер файла, но не в байтах, а в записях. Пример работы с типизированными файлами.
Написать программу чтения из типизированного файла STUDENTS.BSF учетной информации о студентах (содержащей фамилию, номер курса, название группы и средний балл за последнюю сессию), создающую новый файл BAD_STUD.BSF со списком студентов - кандидатов на отчисление с первого курса (у которых средний балл ниже или равен 3.3), и исключающую из исходного списка документы о студентах, со средним баллом ниже 2.7. В конце исходного файла дописать документы стандартной формы с фамилией "Вакансия" и нулевыми значениями остальных полей в количестве, равном числу исключенных студентов. PROGRAM Example; TYPE Document = record {запись основного списка} Name: string[20]; Kurs: 0..6; Groop: string[4]; Ball: real; End; Kandidat = record {запись списка кандидатов на отчисление} Name: string[20]; Groop: string[4]; End; CONST EMPTY: Document = {запись пустого документа - вакансии} (Name: 'Вакансия'; Kurs: 1; Groop: '0000'; Ball: 0.0 ); BAD_BALL = 3.3; {верхний предел балла кандидата на отчисление} VERY_BAD_BALL = 2.7; {верхний предел балла отчисленного студента} VAR Student: Document; {переменная для чтения из входного файла} BadStudent: Kandidat; {переменная для записи в выходной список } i,j,k: integer; Fin: file of Document; {исходный файл документов студентов} Fout: file of Kandidat; {создаваемый файл списка кандидатов } BEGIN Assign (Fin,'STUDENT.DAT'); Reset (Fin); {открытие исходного файла документов } Assign (Fout,'BAD_STUD.DAT'); Rewrite(Fout); {открытие нового файла для списка } i:=0; { i - старый номер студента в исходном файле } j:=0; { j - новый номер студента в исходном файле после исключений } while not SeekEof(Fin) do { пока не достигли конца файла } Begin Seek(Fin,i); { выбираем очередной номер из исходного файла } Read(Fin,Student); { и считываем его в рабочую структуру } if Student.Ball > VERY_BAD_BALL then {если балл выше критерия на отчисление } Begin Seek(Fin,j); { ищем, куда этот документ надо записать в } Write(Fin,Student); { исходный файл и записываем } j:=j+1; { подсчет оставленных студентов if Student.Ball < BAD_BALL then { если балл оставленного студента ниже критерия предупреждения }
Begin BadStudent.Name:= Student.Name; { формируем элемент } BadStudent.Groop:= Student.Groop; { списка кандидатов } Write(Fout, BadStudent); { и выводим очередную запись в файл } end; end; i:=i+1; { подсчет просмотренных документов студентов } end; Close(Fout); { закрыли файл со списком кандидатов } if i>j then { если кого-то исключили } for k:=j+1 to i do { начиная со следующего документа за последним } begin { оставленным студентом и до конца файла } Seek(Fin,k) { подводим указатель на нужное место в файле } Write(Fin, EMPTY); { и записываем туда пустой документ - вакансию } end; Close(Fin); { закрытие исправленного исходного файла документов } END.
Файлы без типов
В Турбо Паскале предусмотрена возможность работать с файлом, у которого не описано строение записи, а определен только размер. По умолчанию размер записи равен 128 байтам, но его можно задать любым значением от 1 до 32767 при открытии файла. Чтение или запись таких файлов выполняется по одной или несколько записей. Для данных в оперативной памяти обычно выделяется место - буфер. Буфер не может быть больше 64 Кбайт, и за одну операцию ввода или вывода нельзя передать данных больше чем размер буфера. Работа с нетипизированным файлом может выполняться как с прямым, так и с последовательным файлом, в котором можно в любой момент перейти на запись с заданным номером. Использование большого по размеру буфера, выполнение операции ввода/вывода сразу для большого числа записей, отсутствие преобразований данных в операциях - все это обеспечивает высокую скорость при работе с такими файлами. Однако ответственность за правильный разбор данных, прочитанных из нетипизированного файла в область оперативной памяти, лежит на программисте. Никакого контроля при вводе и выводе за соответствие типов не производится. Операций обмена для этих файлов выполняются с помощью процедур BlockRead и BlockWrite. Для работы с файлом в режиме прямого доступа используется процедура Seek, для удаления части файла - Truncate. Поиск и фиксация положения в файле выполняется в записях. Чаще всего длина записи принимается равной 1 байту, а ввод/вывод выполняется по такому количеству байт, которое необходимо для ввода или вывода нужного объекта данных. Для этого часто используют стандартную функцию SizeOf.
|
|||||||
Последнее изменение этой страницы: 2016-08-12; просмотров: 202; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.12.76.151 (0.009 с.) |