Вступление
Здраствуйте, дорогие мои! |
||||||||||
ТеорияДумаю все вы имеете представление о файлах. Сегодня мы научимся работать с ними программно. Что из себя представляет файл? Последовательность из байтов. Давным давно, когда компьютеры были большими :) использовались магнитофонные кассеты для хранения информации. Так вот кассета наглядно представляет собой файл: байты идут друг за другом, как песни. Типа так:
Соответственно наша задача на сегодня - научиться читать и писать эти байты. Файл в некотором приближении напоминает массив. Работа с файлом традиционно заключается в следующих действиях:
Итак с начала мы должны создать файловую переменную. Для этого нам нужно указать её тип. Тип файла описывается так: file of типНапример нам нужно описать файл с целыми числами. Тогда мы создадим такой тип: type tIntFile = file of integer; tByteFile = file of byte;второй тип - это тип для файла из байтов. Создав тип мы соответственно можем создать и файловую переменную: var f : tByteFile;Файловые переменные в корне отличаются от привычных нам. С ними нельзя ничего делать (присваивать значения, сравнивать и т.п.) Файловые переменные используются только в специальных процедурах и функциях для работы с файлами. Итак файловая переменная у нас есть. Теперь нам нужно связать её с файлом. Делается с помощью процедуры: procedure Assign(var f; String);Первый параметр - это и есть наша файловая переменная. Второй - это имя файла. Имя файла должно соответствовать требованиям операционной системы. Задаётся оно в виде DRIVE:\path\...\name.expansion Здесь (например для файла на диске С в папке bp с именем readme.txt):
Что бы создать новый файл нужно просто указать не существующее имя. Итак файл связан с файловой переменной, что дальше? Дальше нам надо открыть файл. Для этого существуют следующие процедуры:
procedure Close (var F);Мы обязаны закрыть файл, если мы в него чего-то писали, иначе ничего не сохранится. Вообще закрытие файла, после окончания работы с ним считается одним из правил "хорошего" программирования (с одним правилом вы уже знакомы - не использовать goto). Поэтому мы будем всегда закрывать файл, после работы с ним, даже если мы ничего в него не писали. Тем более, что после закрытия мы можем заново использовать файловую переменную. Вернёмся к ошибке ввода-вывода. Функция: function IOResult: Integer;возвращает целое число, соответствуешее последней ошибке ввода-вывода (отсюда и название: Input-Output Result - результат ввода-вывода, англ.). Если ошибки нет, соответственно вернёт 0. При этом фунция работает только при выключенном режиме контроля ошибок. Например напишем такую программку:
Если у вас нет файла C:\bla.bla то соответственно программа завершится с ошибкой 2 : File not found (файл не найден). Однако такое развитие программы нас (по крайней мере меня) не устраивает. Что же это будет, если программа каждый раз будет завершаться с надписью run time error 2 ??? пользователи явно ничего не поймут. Поэтому нам нужно отключить контроль ошибок ввода-вывода. Итак лезем сюда Options -> Compiler... В появившемся диалоге ищем I/O checking. Если крестик стоит - значит контроль есть, если не стоит - нету. Однако сносить крестик с радостным криком не стоит. Вполне возможно что вам впоследствии понадобится проверка ошибок ввода-вывода. Так что мы пойдём другим путём.
Помните, я говорил про штуки которые похожи на комментарии, но таковыми не являются ? Они начинаются с {$ и заканчиваются } похоже на комментарий. Это диррективы компилятору. Мы можем явно указать, где нужна проверка ошибок ввода-вывода, а где нет. Включение проверки ошибок делается с помощью директивы {$I+} выключение - {$I-}. Теперь перепишем нашу программку так:
Кстати интересная особенность - экран в ДОСе является тоже файлом (файлом ввода и вывода:) Поэтому указав вместо имени файла пустую строку мы получаем доступ к экрану (который у нас и так уже есть :) Теперь переходим к самому интересному - чтению и записи из файла. Для чтения из файла используется уже знакомая нам процедура Read: procedure Read(F , V1 [, V2,...,Vn ] );Первый параметр f - это файловая переменная, а V1 и т.д. - происходит считывание данных из файла в эти переменные. Переменные должны быть того же типа, что и файл. (т.е. если file of byte, то и Vn должно быть типа byte). При чтении файла, нам нужно проверять не достигнут ли конец ? Концом файла является специальный символ, называемый EOF - EndOfFile (конец файла - англ.). Узнать достигнут ли конец файла, можно вызвав одноимённую функцию: function Eof(var F): Boolean;F - файловая переменная. Функция возвращает true, если конец файла достигнут и false в противном случае. Таким образом чтение файла нужно производить в цикле - прочитали что-то, проверили не конец ли. Если не конец, тогда прочитали дальше. Например напишем программу для чтения и вывода на экран текстового файла. Для простоты я указал имя C:\autoexec.bat если у вас нет такого файла, то укажите какой-либо другой:
Думая, что вы уже догадываетесь, какую процедуру нужно использовать, для записи в файл. Правильно! write :)
procedure Write(F, V1 [, V2,...,Vn ] );где F - это файловая переменная, а V1 ... Vn - это список переменных, значения которых мы должны записать в файл. Для примера напишем программу, которая копирует один файл в другой. Что нам для этого надо? Считать байт из одного файла - записать байт в другой и так до конца. Сохраним копию autoexec.bat в autoexec.txt:
|
||||||||||
ПрограммаДумаю понятно, что тип у файла может быть не только предопределённый, но любой созданный нами. Сегодня мы создадим базу данных для учителя :) Она будет содержать имена и оценки учеников. Для каждого ученика создадим запись tstudent с этими данными. type tstudent = record name : string; result : byte end;После этого создадим тип файла, состоящего из таких записей: tfile = file of tstudent;после записи в файл мы ради эксперимента подсчитаем число отличников. Для этого нам надо закрыть файл (т.к. мы открыли файл на запись), а потом открыть его на чтение.
думаю, что текст программы довольно прозрачен.
|
||||||||||
Новости сайта.Новостей сегодня будет много. Так, что детки :), садитесь в круг и слушайте:
|
||||||||||
Послесловиена этом сегодня всё. В следующий раз мы продолжим изучать файлы. |