Средства обработки файлов.
Файлы Большие совокупности данных, например сведения обо всех учащихся школы, телефонный справочник, удобно иметь записанными во внешней памяти в виде последовательности сигналов. Любой сколько-нибудь развитый язык программирования должен содержать средства для организации хранения информации на внешних запоминающих устройствах и доступа к этой информации. В Паскале для целей предусмотрены специальные объекты — файлы. Файлом называется совокупность данных, записанная во внешней памяти под определенным именем. Целесообразность применения файлов диктуется следующими причинами. 1. Ввод больших объемов данных, подлежащих обработке, утомителен и требует большого времени. Гораздо удобнее создать отдельный файл данных, который может быть подготовлен заранее и, самое главное, применяться неоднократно. 2. Файл данных может быть подготовлен другой программой, становясь, таким образом, связующим звеном между двумя разными задачами, а также средством связи программы с внешней средой. 3. Программа, использующая данные из файла, не требует присутствия пользователя в момент фактического исполнения.
Как правило, все действия с файлом (чтение из файла, запись в файл) производится поэлементно, причем в этих действиях участвует текущий элемент файла. В результате совершения операций текущий указатель может перемещаться, настраиваясь на тот или иной элемент файла. По способу доступа к элементам различают файлы последовательного и прямого доступа. Файлом последовательного доступа называется файл, к элементам которого обеспечивается доступ в такой же последовательности, в какой они записывались. Файлом прямого доступа называется файл, доступ к элементам которого осуществляется по адресу элемента.
По типу компонентов файла в Turbo Pascal существуют следующие разновидности файлов: текстовые, типизированные и нетипизированные. Текстовый файл можно рассматривать как последовательность символов, разбитую на строки длиной от 0 до 255 символов. К типизированным файлам относятся файлы строго определенного типа. Чаще всего это файлы, состоящие из записей. Они применяются для создания различных баз данных. Нетипизированный файл рассматривается в Паскале как совокупность символов или байтов. Средства обработки файлов.
Чтобы создавать и обрабатывать файлы в программе, необходимо: 2.задать соответствие между файлом и переменной. Описание файловой переменной зависит от типа файла: -текстовые: -типизированные: -нетипизированные
Для установления соответствия между переменной и реально существующим файлом на диске в языке используется процедура assign (<файловая переменная >,<имя файла>); Зам! Имя файла может быть строковой постоянной, тогда оно записывается в апострофах, или строковой переменной, тогда достаточно указать имя этой переменной. Если файл располагается не в текущей директории, то необходимо указать полный путь до него. Процедура Assign всегда предшествует другим процедурам работы с файлами, так как ставит в соответствие конкретному файлу на внешнем устройстве логическую файловую переменную языка, к которой впоследствии будут обращаться другие файловые процедуры. Недопустимо использование процедуры Assign уже открытого файла. Для работы с файлом, прежде всего, необходимо его открыть. В языке Паскаль предусмотрены для этого две процедуры:
Reset (<файловая переменная >); — открывает существующий файл; Rewrite (<файловая переменная >); — создает и открывает новый файл. Открытие внешнего файла с помощью процедуры Reset в случае отсутствия на диске может привести к ошибке при выполнении программы. При попытке создать и открыть новый файл с именем уже существующего на диске набора данных, действие процедуры сведется к удалению существующего набора, создания и открытия нового.
Операция закрытия файла является логическим окончанием работы с любым открытым файлом. Для этого служит процедура Close (var F); Использование процедуры Close позволяет устранить связь файловой переменной с внешним файлом, установленную с помощью процедуры Assign. Пример: Полная цепочка команд для создания простого текстового файла с именем WORK.TXT: Program _; Var F: text; begin Assign(F, 'WORK.TXT'); Rewrite(F); Write(F,'Простой текстовый файл'); Close(F); end. К языковым средствам обслуживания файлов необходимо отнести процедуры переименования и удаления неоткрытых файлов. Использование этих процедур не зависит от типа файла. Rename(<файловая переменная>,<нов.имя>);- процедура переименовывает неоткрытый файл любого типа Erase(<файловая переменная >);- процедура удаляет неоткрытый внешний файл любого типа Обе процедуры нельзя использовать для уже открытых файлов. В противном случае могут возникнуть нежелательные последствия со стороны операционной системы. Единственным стандартным шагом перед использованием процедур является установка связи между внешним файлом с конкретным именем и файловой переменной. Операции удаления и переименования осуществляются только для реально существующих файлов, иначе возникает ошибка выполнения программы. Пример: Удаление или переименование файла. Program _; Var F: file; Ch: char; St: string; begin Write('Введите имя файла: '); Readln(St); Assign(F, St); Write('Удалить файл(У), Переименовать(П),'); Readln(Ch); case Ch of 'у': Erase(F); 'п': begin Write(‘Введите новое имя файла: '); Readln(St); Rename(F, St); end; end. Для чтения и записи данных используют следующие процедуры: READ(<файл.пер >,<переменная>)-процедура чтения из файла в переменную. WRITE (<файл.пер >,<переменная>)- процедура записи из переменной в файл. Часто при работе с файлами используется функция:
EOF (<файловая переменная>) - возвращает булевское значение True, если указатель чтения- записи в конце файла, и False — в противном случае.
Для того чтобы файловые операции выполнялись четко и без ошибок, необходимо использовать специальную функцию IOresult. Функция работает без параметров и возвращает значение типа integer, представляющее статус последней выполненной операции ввода-вывода: после корректного выполнения операции ввода-вывода функция IOresult возвращает значение, равное нулю, в остальных случаях функция возвращает соответствующий код ошибки. Использование этой функции в программах возможно лишь в том случае, если на время выполнения файловых операций отключена стандартная проверка операций ввода-вывода. Для этих целей используется директива компилятору {$I}, которая может задаваться внутри текста программы. Пример: Вариант программы для проверки существования файла на диске Program _; Var F: file; St: string; begin Write('Введите имя файла: '); Readln(St); Assign(F, St); {$I—} {Отключить стандартную обработку ошибок} Reset(F); {Открыть файл} {$I+} {Включить стандартную обработку ошибок} if IOresult = 0 then begin Writeln('Файл существует и нормально открыт’); else Writeln('Файла с именем’,St,' на диске нет'); end.
Дома: Разобрать и выучить все функции обработки файлов.
Лекция 37. Текстовые файлы Текстовый файл можно рассматривать как последовательность символов, разбитую на строки длиной от 0 до 255 символов. Для описания используется стандартный тип Text: Var < файловая переменная>: text; Каждая строка завершается маркером конца строки. На практике такой маркер представляет собой последовательность из двух символов: перевод строки chr(13) и возврат каретки chr(10). Эти два символа задают стандартные действия по управлению текстовыми файлами. Стандартно открываемые предопределенные файлы Input и Output в модуле System имеют тип Text У текстовых файлов своя специфика. Специальные расширения стандартных процедур чтения Read и записи Write разрешают работать со значениями несимвольного типа. Другими словами, последовательность символов автоматически преобразуется к значению того типа переменной, которая используется в файловых операциях.
Вызов Read(F, W), где W — переменная типа word, осуществляет чтение из файла F последовательности цифр, которая затем интерпретируется в число, значение которого и будет присвоено переменной W. В случае если вместо последовательности цифр идет любая другая последовательность символов, использование такого оператора приводит к ошибке выполнения программы. Открытие текстового файла можно произвести двумя стандартными способами: 1. поставить в соответствие файловой переменной имя файла (процедура Assign), открыть новый текстовый файл (процедура Rewrite); 2. поставить в соответствие файловой переменной имя файла (процедура Assign), открыть уже существующий файл (процедура Reset). Текстовый файл в силу своей специфики во время работы допускает какой-либо один вид операции: чтение или запись. В связи с этим для работы с текстовыми файлами появляется еще одна процедура открытия файла: Append(<файловая переменная>);
Эта процедура открывает уже существующий файл и позиционирует указатель обработки на конец файла. После такого открытия текстовый файл можно только дополнять информацией, начиная с конца строки. Ограничения, накладываемые на процедуру Append, такие же, как у процедур Reset и Rewrite. Для обработки текстовых файлов используются процедуры Read и Write, обеспечивающие соответственно чтение и запись одной строки и более в текстовый файл. Использование специальных разделителей строк файла позволило ввести в состав языковых средств процедуры Readln. Процедура Read обеспечивает ввод данных общим потоком из одной строки, a Readln приводит к обязательному переходу к следующей строке текстового файла, т.е. ввод данных осуществляется из различных строк. Writeln, обеспечивающую запись всех величин с обязательной установкой маркера конца строки в файл. Общий вид представления процедур следующий: Readln(var F: text; VI [,V2,...Vn]); Writeln(var F: text; VI [,V2,...Vn]); где VI...Vn переменные разных типов. При организации операций ввода-вывода используются специальные языковые средства в виде функций Eoln, Eof Функция Eof(var F: text) возвращает булевское значение True, если указатель конца файла находится сразу за последним компонентом, и False — в противном случае. Функция Eoln(var F: text) возвращает булевское значение True, если текущая файловая позиция находится на маркере конца строки или вызов Eof(F) возвратил значение True. Во всех других случаях значение функции будет False. Задачи: 1. Дан файл «Primer.txt» вывести на экран его содержимое.
program _; uses crt; var f: text; a:string; i,k: byte; begin clrscr; assign(f,'primer.txt'); reset(f); while not eof(f) do begin Readln(f,a); writeln(a); end; close(f); end. 2. Дан файл «Work.txt» при выводе файла на экран заменить все цифры на «*». program _; uses crt; var f: text; a:string; i,k: byte; begin clrscr; assign(f,'work.txt'); reset(f); while eof(f) do begin Readln(f,a); For i:= 1 to length(a) do If (a[i]>=’0’) and (a[i]<=’9’) then a[i]:=’*’; writeln(a); end; close(f); end. 3. Создать свой текстовый файл, поместить в него заглавные русские буквы. program _; uses crt; var f: text; a, nane:string; i,k: byte; begin Writeln(‘введите имя создаваемого файла’); Readln(name); assign(f,name); rewrite(f); for i:=128 to 159 do begin write(f,chr(i):3); k:=k+1; if k=16 then begin writeln(f); k:=0; end; end; close(f); end.
4. Дан файл, заполненный заглавными русскими буквами, дописать в него маленькие русские буквы. program _; uses crt; var f: text; a,name:string; i,k: byte; begin clrscr; Writeln(‘введите имя файла, в который будем дописывать ’); Readln(name); assign(f,name); append(f); for i:=160 to 175 do begin write(f,chr(i):3); k:=k+1; if k=16 then begin writeln(f); k:=0; end; end; for i:=224 to 239 do begin write(f,chr(i):3); k:=k+1; if k=16 then begin writeln(f); k:=0; end; end; close(f); end. 5. Написать программу, обеспечивающую создание на диске текстового файла и запись в него. Program _; uses crt; var f:text; new, name: string; s: char; i:integer; begin clrscr; Writeln(‘введите имя создаваемого файла’); Readln(name); assign(f,name); rewrite(f); writeln('введи текст, для завершения нажми enter');
repeat readln(new); write(f,new); until new=’’; close(f); end. 6. Скопировать содержимое одного файла в другой. program _; uses crt; var f1,f2: text; a:string;
i,k: byte; begin clrscr; assign(f1,'work.txt'); assign(f2,'we.txt'); reset(f1); rewrite(f2); while not eof(f1) do begin readln(f1,a); writeln(f2,a); end; close(f1); close(f2); end. Использование буфера ввода-вывода. Рассмотрим процедуру обмена информацией между программой и внешним текстовым файлом на диске. Для передачи данных используется буфер ввода-вывода в виде участка оперативной памяти, через который осуществляются все операции обмена. Для языка Паскаль стандартный буфер ввода-вывода имеет объем 128 байт. Каждому открытому файлу вместе с обработчиком назначается и свой буфер. Возникает задача оптимизации обращения к внешним носителям информации. Например, процедура Writeln записывает все данные последовательно в буфер, физическая запись на внешнее устройство происходит только тогда, когда информацией будет занят последний байт буфера. После записи на диск буфер освобождается для приема следующей порции информации. Таким образом, достигается компромисс между количеством и длительностью обращений к диску. Если бы каждый вызов процедуры Writeln приводил на практике к физическому обращению к диску, то тратилось бы непозволительно много времени на позиционирование головки чтения-записи для доступа к файлу. Специально введенная процедура Flush(<файловая переменная>) дает возможность связать запись с помощью процедур Write и Writeln непосредственно с физической записью на диск. Вызов процедуры гарантирует, что все символы, переданные для записи, действительно в это же время будут записаны во внешний файл. Использовать процедуру можно для текстовых файлов, открытых только для записи процедурами Rewrite и Append. В прикладных программах процедуру используют редко, как правило, в тех случаях, когда необходимо подтверждение о физической записи во внешний файл Процедура SetTextBuf (<файл. переменной>;Buf[; size])- дает возможность назначить свой буфер ввода-вывода (Buf) необходимого объема (Size) текстовому файлу. Параметр Size при вызове может быть опущен. В этом случае размер буфера соответсвует SizeOf(Buf). Назначение SetTextBuf файловой переменной распространяется до следующего использования переменной новым внешним файлом. Пример: Назначение буфера ввода-вывода. var F: text; Ch: char; Buf: array[1..2048] of char; {Буфер 2 Кбайта} begin Assign(F,’primer.txt’); SetTextBuf(F, Buf);{Установить файлу буфер 2 Кбайта} Reset(f); while not Eof(F) do begin {Вывести файл на экран} Read(F, Ch); ц Write(Ch); end; end. Потери информации при обмене будут исключены, если переназначение буфера ввода-вывода будет осуществлено после вызова процедуры Assign либо сразу после процедур открытия файлов до любой операции обмена. Лекция 38.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|