Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 192; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.116.49.243 (0.008 с.) |