Операции ввода-вывода Write, Read

Процедура read предназначена для чтения значений из файла в программу. Первым параметром должно быть имя файловой переменной, к которой была применена одна из операций открытия (reset, rewrite). Далее должны следовать переменные, в которые будут помещаться читаемые из файла значения. Тип этих переменных должен совпадать с базовым типом файла из первого параметра. Начиная с текущей позиции указателя файла будут последовательно читаться значения, содержащиеся в файле.

Процедура write имеет обратный смысл, позволяя записывать в файл информацию из программы. Первым параметром должна быть файловая переменная (открытая). Далее должен следовать список выражений.

Выполнение процедуры write следующее:

Значение очередного выражения будет помещено в файл в место, отмеченное текущим указателем. После этого текущий указатель будет передвинут на одну позицию и действия повторяются для следующего выражения из списка параметров вызова процедуры write.

 

13.3. Перемещение по файлу.

При помощи двух процедур: Seek, Truncate.

И три дополнительные функции: FileSize, FilePos, EOF.

Процедура Seek позволяет явно изменить значение текущего указателя, установив его на элемент файла с заданным номером. Процедура имеет два параметра : переменную файлового типа и целое (типа longint).

Функции FileSize, FilePos позволяют получить дополнительную информацию о файле, который указывается в качестве их единственного параметра. Первая процедура возвращает общее число элементов файла, а вторая - номер текущего указателя.

Seek(f, FilePos(f)+1) {пропуск одного элемента}

Seek (f,0) {установка указателя на начало файла}

Seek(f, FileSize(f)) {установка за следующий за последним текущего указателя.

Добавление в 'хвост' файла данных}

Функция Eof вызывается с одним параметром - файловой переменной - и возвращает логическое значение true или false в зависимости от того достигнут ли конец файла или нет.

Процедура truncate используется для отсечения от файла его хвостовой части, начиная от текущей позиции указателя включительно. Параметр - файловая переменная.

 

13.4 Обработка ошибок ввода - вывода

При работе с файлами на внешних устройствах с достаточно высокой вероятностью может возникнуть ошибочная ситуация. По умолчанию при выполнении любой операции автоматически производится проверка на возникновение ошибок. При обнаружении ошибки выполнение программы прекращается, а на экране дисплея выводится краткое диагностическое сообщение, содержащий условный номер ошибки.

В системе имеется возможность предусмотреть собственную реакцию на ошибочные ситуации в самой программе. Для этого необходимо в начале опасного фрагмента отключить автоматическую проверку на возникновение ошибки {$I-}.

Тогда программа в случае ошибки не вызовет ее остановку, а запомнит в стандартной функции без параметров. И в зависимости от ее значения построить дальнейшие действия.

….

Assign(f, 'c:/data');

{$I-}

reset(f);

{$I+}

if ioresult <>0 then

write ('ошибка при открытии файла');

…..

Следует отметить, что после отключения режима автоматического контроля следует проверить сразу состояние ioresult. Пока этого не будет сделано, работу продолжать нельзя. После обращения переменная обнуляется до следующего аварийного завершения обращения к файлу.

Assign(f, 'c:/data' );

{$I-}

reset (f);

code:=ioresult;

if code<>0 then begin

write('ошибка при открытии файла : ');

case code of

1: write ('файл не найден');

3: write ('маршрут не найден');

4: write ('слишком много открытых файлов');

5: write ('запрет доступа к файлу');

12: write ('некорректный код доступа к файлу');

else

….

End;

End;

{$I+}

 

13.5 Текстовые файлы

Паскаль имеет средства взаимодействия с файлами несколько иной структуры - текстовыми файлами. Структура текстовых файлов отличается от структуры обычных файлов (линейная последовательность элементов одного типа) тем, что содержимое текстового файла рассматривается как последовательность символьных строк переменной длины, разделенных специальной комбинацией, называемой 'конец строки', 'перевод каретки' (#B), за которым возможно следует перевод строки (#10). Текстовый файл завершает специальный символ (#26).

Текстовый файл объявляется так:

Var

TextInf : text;

Для текстовых файлов применимы те же самые операции инициализации, открытия и закрытия, что и для обычных файлов. За исключением того, что reset открывает файл только для чтения, rewrite - для его обновления.

Дополнительно для текстовых файлов определены следующие операции:

· Append - один параметр - файловая переменная. Аналогична rewrite, но не очищает файл, а добавляет новые строки в конец уже существующего файла.

· SetTextBuf - процедура, определяющая буфер для обмена с текстовым файлом.

· SetTextBuf (var f: text; var Buf; Size :word);

Операции ввода - вывода это read, write. Здесь необходимо помнить, что текстовый файл по определению содержит символьную информацию, поэтому при записи значения других типов будут преобразовываться в символьное представление. Для текстовых файлов имеется две модификации - процедуры Readln, writeln. Выполняют те же действия, что и read, write, но после операции чтения и записи производится переход к следующей строке текстового файла.

Для текстовых файлов неприменима процедура seek ввиду произвольных длин строк. Для решения задач перехода используются функции SeekEoln и SeekEof - с файловой переменной.

· SekEoln - производит поиск конца текущей строки и возвращает true

· SeekEof - осуществляет поиск конца файла, либо первого значащего символа. True - конец файла, false - в ином случае.

 

13.6 Файлы без типа.

Объявляются как:

Var

Data : file;

Понятие не типизированных файлов используется для организации доступа к любым дисковым файлам независимо от их структуры. При этом файл представляется как последовательность символов произвольного типа; единственное, что оговаривается - это размер элементов.

Не типизированные файлы открываются теми же процедурами, что и обычные текстовые файлы, - reset, rewrite, но для не типизированных файлов вторым параметром этих процедур должен быть задан размер записи.

Assign(data, 'Mydata.dta');

Reset (data, 200);

Размер записи задается в байтах.

Для организации обменов с не типизированными файлами предназначены две стандартные процедуры: BlockRead, BlockWrite.

В качестве рабочего буфера для обменов используется переменная, которую необходимо описать в программе и размер которой не должен быть меньше размера записи, установленной в параметрах reset, rewrite.

BlockRead (var f: file; var Buf; Count :word);

BlockRead (var f:file; var Buf; Count: word; var Result : word);

F - имя не типизированного файла, из которого производится чтение ;

Buf - переменная - буфер;

Count - число записей читаемых за один вызов;

Result - число фактически прочитанных записей.

Аналогично описывается стандартная процедура BlockWrite. В обеих процедурах нужно следить за тем, чтобы переменной буфера buf был равен RecSize* Count, где первое - это размер записи указанной в процедуре reset или rewrite и второе - число читаемых - записывающих записей.