План - конспект урока

by Сазонов Д. 4 курс. inf

 

 

Цель урока: познакомить учащихся с понятием файла и научить их

работать с этим типом данных.

Тип урока: изучение нового материала

 

Ход урока

 

  1. Организационный момент
  2. Проверка домашнего задания
  3. (если никто ничего опять не сделал всем поставить двойки в

    журнал)

  4. Объяснение новой темы

 

По определению, предлагаемому в англо-русском словаре по программированию файл - это поименованная целостная совокупность данных на внешнем носителе. В учебнике по Borland Pascal 7.0 файл определяется, как именованная область внешней памяти, содержащая какую либо информацию. Причем последнее определение дано не совсем корректно т.к. файл может и не содержать никакой информации (быть нулевым). Так что же такое файл? На самом деле файлом можно назвать любые данные, записанные на внешний носитель, объединенные одним именем. Под внешним носителем я предполагаю винчестер (основное запоминающее устройство в PC), дискету или оптический диск. При этом файл может не содержать никакой информации - быть нулевым. Вообще файлы очень похожи на массивы. И действительно у них обоих должно быть имя, и кроме того элементы и в файл и в массиве идут по порядку т.е. за первый будет второй и т.д. Исключение лишь составляет то, что размеры файла практически не ограничены и если стандартный массив может быть не больше 65536 ячеек 216, то файл может быть размером не больше 232. Реально же файлы такого размера не встречаются, на практике размер файла не превышает 500 Мб. Такой различие в допустимых границах возможно только потому, что массивы размешаются в ОЗУ (оперативно запоминающем устройстве) и после выключения питанию будут потеряны навсегда, а файлы на диске будут оставаться пока вы их не сотрете. Примером файла может быть любая программа, которую вы набираете на занятиях, а затем, выбирая опцию SAVE, записываете на диск. Далее мы будем рассматривать файлы как массивы, но только очень большого размера. Но здесь появляются сразу несколько особенностей файлов.

  1. элементы файла всегда начинаются с нулевого индекса.
  2. размер файла, в отличии от массива, может динамически меняться
  3. У каждого файла должно быть свое личное имя и номер.
  4. Чтобы начать работу с файлом, его нужно открыть, а после работы закрыть - это обязательные правила.
  5. Скорость работы с файлами значительно ниже, чем работа с

массивами.

Кроме того, уже в самом начале мне бы хотелось дать вам пару советов по работе с файлами.

  1. После того как вы поработали с файлом, стирайте его с диска
  2. (если он уже не нужен). Только убедитесь, что вы стираете

    именно ваш файл. В дальнейшем это вам сильно "упростит

    жизнь" и работу.

  3. Никогда не используйте циклов FOR для вывода файлов.
  4. Пользуйтесь While и Until. Почему я объясню позже.

  5. В учебной практике не делайте без необходимости файлы больше
  6. 100Кб, т.к. большое кол-во таких файлов сократит место на

    диске. Конечно можно поэкспериментировать, но после

    эксперимента лучше стереть этот файл. По своей сути

    компьютерные игры тоже являются файлами с большой длинной

    и потому несколько копий игры уже может заметно

    израсходовать память, необходимую для написания программ на

    занятиях. По этому не храните несколько копий игры на одной

    машине. И вообще лучше игры записывать на одну машину, а

    потом, чтобы поиграть в свободное время подключать к ней по

    сети.

  7. Внимательно следите за файлами, которые представляют для вас ценность. Всегда делайте копии таких программ на дискетах.
  8. Не стоит писать имя файла по русски. Компьютер понимает

только латинские символы.

 

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

 

Имя и номер.

 

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

Имя . Расширение

Существует несколько стандартный расширений для файлов, вот основные из них.

Exe, com - говорит о том, что файл является готовой к выполнению

программой.

Bat - программа на Bat-языке.

PAS - текст программы написанной на языке PASCAL

BAS - программа, написанная на BASIC

С - программа, написанная на С++

Txt - файл содержащий какой то текст

Doc - текст (курсовая, диплом и т.д). Просматривается под Windows.

Bmp, pcx, jpg, tff, gif - картинки или рисунки, возможно фотографии

(см. главу Графика)

Sys, dll, vxd - системные файлы. Требуются для работы компьютера.

Avi, mov, Dat - видио фильмы, мультвильмы и т.д.

Snd, wav, mid - музыкальные файлы, человеческая речь и т.д.

BAK - резервная копия. Файлы с этим расширением принято

удалять! Не перепутайте с BAT.

 

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

Имя же помогает уточнить эту информацию.

Например:

Win. Com - означает, что файл является исполняемым файлом и принадлежит WINdows.

Game.bmp - картинка, явно относящаяся к какой-то компьютерной игре.

В некоторых системах, таких как Unix, Windows NT, Windows 95-98 используются длинные имена т.е. имя и расширение может быть до 255 символов длинны. В таких ОС вы можете встретить файлы с 2,3 и более расширениями (Например: game.gz.tar). Но скорей всего на практике в программировании работать с длинными именами вам не придется по этому принципы работы с ними рассмотрены не будут.

Ну вроде бы с именами мы разобрались, перейдем к номеру.

Дело в том, что при работе с файлами компьютер обращается к ним не по именам а по номеру, поскольку для хранения номера достаточно одной ячейки памяти, а для имени нужно 12 ячеек. Кроме того, так проще найти файл, перебирая номера, а не имена.

Подробнее эта методика будет описана вам на курсе ассемблера.

Итак мы дали фалу имя, получили его номер (на BASIC номер указывается автором программы), далее мы должны решить что мы с ним хотим сделать. Возможны несколько вариантов основных команд.

  1. Создать файл на диске (в этом случае он получается нулевым и готовым к дальнейшему использованию). При записи если файл создан не был, он создается автоматически.
  2. Записать в файл данные.
  3. Прочитать данные из файла
  4. Стереть его.

Кроме того, все языки высокого уровня позволяют выполнять еще следующие действия над файлами:

  1. Читать/записывать файл не по кусочку (как мы делали с массивами. В массиве можно работать одновременно только с одним элементом), а сразу весь целиком.
  2. Изменять свойства файла (делать его скрытым или только для чтения т.е. в файл нельзя ничего записать)
  3. Определить длину файла.
  4. Отрезать кусок от конца файла.
  5. В произвольном порядке считывать и записывать элементы в файл. Т.е. если файл создан, то можно считать сначала первый элемент, потом последний, затем из середины и т.д.
  6. Если файл уже создан к нему можно дописать информацию.
  7. Можно объединять файлы в один.
  8. Проводить поиск файлов. Из нескольких файлов найти нужный, или осуществить поиск нужного файла по всему диску.

Стало быть вся работа с файлами сводится к совместному использованию основных команд и действий над файлами.

 

 

ФАЙЛЫ И BASIC

 

Для работы с файлом в Basic, да и в других языках тоже сначала его надо открыть (задать его имя и номер).

Открывает файл оператор OPEN.

Формат команды следующий:

 

OPEN имя файла FOR тип файла AS # номер файла

 

Тип файла определяет, для чего файл открывается:

OUTPUT - для записи в файл

INPUT - для чтения из файла

RANDOM - из файла можно читать и можно писать в него

 

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

 

FREEFILE - позволяет узнать первый свободный номер файла и использовать его в качестве параметра для OPEN.

Пример:

f=FREEFILE

OPEN "file.txt" FOR RANDOM AS f

………

где file.txt - имя файла.

Быстрее, но менее верно было бы написать:

OPEN "file.txt" FOR RANDOM AS 1

 

Так как файлы в некотором роде похожи на массивы давайте попробуем научиться выполнять действия те же, что и с файлами, а далее перейдем к дополнительному материалу.

 

Итак, как создавать файл мы уже знаем. Теперь надо в него что либо записать. В отличии от массива в файл элементы можно записывать всегда только в порядке очереди: за первым, второй, затем третий и т.д. , но никак нельзя записать сначала последний, а потом вернуть к началу (рассматривается случай создания нового файла).

Запись в файл осуществляется наверняка уже известным вам оператором PRINT.

 

Формат команды:

 

PRINT #номер файла, очередной элемент,….., очередной элемент

 

Чтение из файла, осуществляется противоположной по смыслу PRINT командой INPUT.

 

INPUT #номер файла, переменная куда будет считано значение

 

Чтобы запомнить эти операторы предлагаю вам рассуждать так:

"я хочу прочитать содержимое файла, для этого нужна какая-то команда. Прочитать из файла - значит получить данные, которые когда-либо были записаны или набраны с клавиатуры. Иначе говоря надо ввести данные в компьютер. Чем я пользовался(лась), когда мне было нужно ввести данные в компьютер? Оператором INPUT. Стало быть, чтобы считать из файла мне надо пользоваться INPUT."

Аналогично попробуйте порассуждать про PRINT (вывод в файл), учитывая, что раньше мы пользовались PRINT, чтобы печатать на экране.

 

 

Прежде чем привести пример на чтение и запись, нам просто придется разобрать оператор EOF.

 

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

10 input #1,a

20 Print a

30 goto 10

Когда все данные будут прочитаны из файла, программа выдаст сообщение об ошибке т.к. input #1,a будет продолжать считывание.

Оператор EOF как раз говорит о том, что файл закончился, а чтобы узнать про какой файл(вдруг их в программе несколько) идет речь в качестве параметра EOF надо передать номер файла.

 

EOF (номер файла)

 

С учетом выше сказанного можно написать так:

 

10 if EOF(1) goto 50

20 input #1,a

30 Print a

40 goto 10

А лучше всего использовать для этих целей оператор цикла WHILE, тогда:

 

Do While not eof(1)

input #1,a

Print a

loop

 

И номера строк уже нам не нужны.

 

Итак, ввод файла на 10 элементов:

 

f = FREEFILE

OPEN "file.txt" FOR OUTPUT AS #f

FOR i = 1 TO 10

PRINT #1, i

NEXT i

CLOSE #f

вывод файла:

 

f = FREEFILE

OPEN "file.txt" FOR INPUT AS #f

DO WHILE NOT EOF(F)

INPUT #F, i

PRINT i

LOOP

CLOSE #f

 

После просмотра этих двух программ вас наверно заинтересовало для чего нужен оператор CLOSE.

 

На этот вопрос обычно дается простой ответ: "он закрывает файл. И при работе с файлами используется всегда, как NEXT вместе с FOR"

И это действительно так. Если не использовать CLOSE вы можете потерять данные, находящиеся в файле. В общем, пока вы работаете с файлами вам придется пользоваться CLOSE.

Если у вас много файлов (хотя бы больше 2х), то нецелесообразно для каждого из них писать CLOSE. В Qbasic есть специальный оператор, который закрывает все открытые файлы одновременно. Этот оператор называется RESET.

 

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

В Qbasic определить позицию указателя можно с помощью оператора LOC, которому в качестве параметра передается номер открытого файла.

 

LOC(номер файла)

 

По всей видимости команда произошла от слова Location, что можно перевести как место нахождение.

 

По мимо позиции, мы можем определить длину файла целиком, для этого будем использовать оператор LOF (сокращение от английского Length of file "длина файла")

 

LOF(номер файла).

 

Вы можете спросить: "Если мы можем узнать длину файла целиком, почему же тогда не использовать цикл for? Зачем использовать while not eof()?"

Так вот, опять же если файл слишком большой, то может быть сбой в программе. Например, многие компиляторы Basic поддерживают переменные целого типа в цикле for, а как мы знаем обычный целый тип может принимать значения от -32768 до 32768 (0…65535), но если длинна файла окажется больше 65535. Тогда произойдет ошибка т.к. цикл выйдет за пределы допустимых значений.

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

 

Теперь, когда мы уже знаем как записать и прочитать из файла, а кроме того можем определить его длину остается всего один оператор для полного ознакомления с данной темой. Это оператор SEEK (в переводе- искать, достигать). С помощью этого оператора можно осуществить произвольный доступ к любому элементу файла. Например можно просмотреть файл с конца, а не с начала. Или можно посмотреть, что находится в его середине и т.д.

Формат команды:

 

SEEK #номер файла, номер элемента

 

Кроме этого, с помощью оператора SEEK можно узнать текущую позицию указателя в файле т.е. в какой индекс будет записан следующий элемент. Тогда формат команды-функции SEEK будет иметь вид:

SEEK(номер файла)

Пример:

A=SEEK(#1)

PRINT SEEK(n) и т.д.

Итог: домашнее задание.

 

ЗАДАЧА1: Ввести файл. И вывести его содержимое с конца файла.

 

ЗАДАЧА2 (для "продвинутых" учеников или для тех, кто баловался на уроке): Даны два файла (File1.bak и File2.bak). Определить сколько элементов одного файла повторяются в другом файле.

 

Решение задачи 1

CLS

n = FREEFILE

OPEN "test.tmp" FOR OUTPUT AS n

REM заполняем файл числами от 1 до 20

FOR i = 1 TO 20

PRINT #n, i

PRINT i;

NEXT i

CLOSE #n

PRINT : PRINT

REM открываю файл опять для чтения

REM но на сей раз читать будет с конца

n = FREEFILE

OPEN "test.tmp" FOR INPUT AS n

REM перемещаюсь к концу файла.Index - будет определять элемент для считывания

index = LOF(n) - 1

DO WHILE index > 0

SEEK #n, index

INPUT #n, a$

PRINT a$; " ";

REM переходим к предыдущему элементы файла

index = index - 3

LOOP

 

Решение задачи 2

CLS

OPEN "file1.bak" FOR INPUT AS #1

OPEN "file1.bak" FOR INPUT AS #2

DO WHILE NOT EOF(1)

INPUT #1, a

REM count- кол-во повторяющихся элементов

count = 0

SEEK #2, 1

DO WHILE NOT EOF(2)

INPUT #2, b

IF a = b THEN count = count + 1

LOOP

PRINT a; " встречается "; count; " раз"

LOOP

RESET

 

 

 

ВСЁ !