Доброго времени суток, уважаемые подписчики!!!
Сегодня мы продолжим наш разговор о работе с файлами и рассмотрим приёмы работы с типизированными и нетипизированными файлами. Итак, начнём, начнём с типизированных файлов.
В принципе, Вы уже работа с типизированными файлами, когда работали с текстовыми, т. к. описания файлов:
f:text; f1:file of char;
эквивалентны. Как и в указанном примере, чтобы описать типизированный файл необходимо написать file of и затем указать тип наполнения файлов. Это очень удобно, например, при работе с записями (о них речь пойдёт чуть позже). Не пытайтесь внести данные в файл, а затем прочитать их из типизированного файла. В этом случае лучше воспользоваться стандартными текстовыми файлами. Типизированные файлы чаще всего используются для программной записи информации и программного считывания. Приведу пример: если вручную набрать числа в файл, а затем прочитать их из файла, воспользовавшись file of byte; у Вас ничего не получится, так как в этом случае он будет запоминать не те числа, которые Вы написали, а код символа (в том числе и пробел). Кроме того, при работе с типизированными файлами не допускается использование процедур writeln/readln. Можно
пользоваться только read/write Так что лично я советую Вам просто запомнить, что есть такие типизированные файлы (они Вам пригодятся). Если хотите, то поэкспериментируйте с ними, чтобы получше понять преимущества и недостатки их. Попробуйте придумать, где можно применять эти файлы.
Теперь попробуем разобраться с нетипизированными файлами. Чтобы описать переменную-нетипизированный файл, достаточно после двоеточия просто указать слово file. Например:
F: file;
Работа с этими файлами на мой взгляд ещё более сложна. Восновном эти файлы используются, если надо записать/считать большой объём информации. Если считывать и записывать поэлементно, то это будет достаточно долго при большом кол-ве элементов (это связано с особенностями работы жёсткого диска). Чтобы ускорить этот процесс придумали считывать (или записывать) массив элементов buf. Для этого существуют процедуры blockread (чтение) и blockwrite (запись). Синтаксис:
Здесь f - переменная нетипизированный файл; buf - переменная буфер; <n - кол-во элементов, которое необходимо считать (записать); rezult - необязательный параметр (необязательные параметры всегда берутся в []. При использовании процедуры скобки не используются) - кол-во элементов, которое считалось (записалось)
на самом деле. При работе с нетипизированными файлами нельзя использовать стандартные процедуры ввода/вывода.
Теперь Вы уже знаете основные элементы, используемые при работе с файлами. Напоследок приведу несколько полезных процедур и функций, также использующихся при работе с файлами.
chdir(path) - процедура, позволяющая изменять текущий каталог на каталог path, где path - переменная строкового типа, не включающая в себя имя файла (только путь); erase (f) - процедура, позволяющая удалять файл, с которым связана файловая переменная f; getdir (n,s) - получение текущего каталога накопителя, где n - номер накопителя (0 - текущий накопитель; 1 - накопитель A; 2 - накопитель B и т. д.), s - переменная типа string, в которую и записывается текущий каталог; Mkdir (path) - процедура, создающая каталог, путь к которому указывается переменной path строкового типа; rename(f,newname) - переименовывает файл, с которым связана файловая переменная f в файл с именем newname;RmDir (path) - удаляет ПУСТОЙ каталог, путь до которого указан переменной типа string - path; Eof(f) - функция, которая принимает значение true, если указатель текущей компоненты файла находится за последней компонентой файла (конец файла), false - в ином случае; IoRezult - функция, в которой хранится 0, если последняя операция ввода/вывода завершилась успешно, или другое число в противном случае. Например, файл не открылся, тогда выполнится следующее условие: Iorezult<>0
На этом сегодня всё. Всё - это имеется ввиду из теории. Теперь осталась домашняя задача и первые места нашего турнира: Домашняя задача. Участники турнира просили дать задачку посложней. Ну чтож, ловите:
"Ладьи"
Дана шахматная доска размером N*N (1<=N<=1000), в некоторых клетках которой стоят ладьи. Будем считать, что две одноцветные ладьи бьют друг друга, если они стоят на одной горизонтали или вертикали и между ними нет других ладей. Требуется создать программу для выполнения раскраски расположенных на шахматной доске ладей наименьшим количеством цветов таким образом, чтобы одноцветные ладьи не били друг друга.
Технические требования:
Входной файл: Input.txt Выходной файл: output.txt
Формат входных данных:
Входной файл input.txt
содержит последовательность N+1 строк. В первой строке записано целое число N. Каждая из последующих N строк служит для описания расположения ладей на шахматной доске по горизонталям. Клетка с ладьей обозначается буквой "Л", без ладьи - буква "П". Символы в одной строке разделены пробелами.
Формат выходных данных:
Выходной файл Output.txt должен содержать одно число - искомое количество цветов.
Пример файла входных данных:
3 Л Л Л П Л П Л П П
Пример файла выходных данных (для приведенного выше входного файла):
2
Ну а теперь о нашем турнире!
В настоящее время, первые 3 места таблицы распределены между участниками турнира следующим образом: 1 место - Strory - 40 баллов; 2 и 3 место - GriFe и Pavel Strapko - по 25 баллов.
Желаю всем удачи и надеюсь, что с новой задачей проблем не будет!
На сегодня это всё. Пожелания и предложения пишите мне на e-mail: qsman1987@mail.ru