Особенности работы с текстовыми файлами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Особенности работы с текстовыми файлами



 

Для работы с текстовым файлом файловая переменная описывается стандартным описателем 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; просмотров: 162; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.147.46.58 (0.028 с.)