Работа с файлами Материал и презентация:Сазонов Д.О. ПМиЭММ e-mail:nimnul@yandex.ru.

Презентация:



Advertisements
Похожие презентации
Файловый тип данных Файл – это область памяти на внешнем носителе, в которой хранится некоторая информация. В языке Паскаль файл представляет собой последовательность.
Advertisements

Файловый тип данных Turbo Pascal Операции для работы с файлами 11 класс.
Множества значений или переменных с одним общим именем называются структурированными типами. По способу организации и типу компонентов выделяют: 1. Массивы.
Работа с файлами.. Процедура Assign(var f; name : String); Связывает внешний файл с именем name и переменную файлового типа f. Все дальнейшие операции.
Нетипизированный файл рассматривается в Паскале как совокупность символов или байтов. Выбор char или byte не играет никакой роли, важен лишь объем занимаемых.
Программирование типовых алгоритмов вычислений Информатика.
Пусть нам необходимо сформировать текстовый файл с помощью Паскаля, а затем переписать из данного файла во второй только те строки, которые начинаются.
Файловый ввод- вывод данных в Pascalе Средства обработки файлов 11 класс Дугина Ирина Радиковна, учитель информатики и ИКТ, МБОУ СОШ с.Камышки Александрово-Гайского.
1 Файловый тип данных Файл – это область памяти на внешнем носителе, в которой хранится некоторая информация. Файл – это набор данных, хранящихся во внешней.
Файловая переменная. Файл – совокупность данных, записанная во внешней памяти под определенным именем. Любой файл имеет три характерные особенности: уникальное.
1 Программирование на языке Паскаль Тема: Файлы. Integer, Real, Boolean, Character, String, Text.
Тип данных файл 1 курс. План: 1.Понятие типа данных файл. Дескриптор файла. 2.Классификация файлов в Паскале. 3.Структура описания типа данных файл. 4.Действия.
Теперь, когда вы постигли азы программирования, будем учиться писать программы, которые позволяют вести диалог между компьютером и человеком (пользователем).
Файлы - именованная область внешней памяти ЭВМ, хранящая совокупность данных. Файл.
Program wr_text; var f: text; st: integer; i:integer; begin assign(f,'l1.TXT'); rewrite(f); write('вводите поочередно числа, после ввода очередного числа.
Массивы Материалы к урокам по программированию. МАССИВ это УПОРЯДОЧЕННАЯ последовательность данных ОДНОГО ТИПА. Массивы относятся к структурированным.
1 Программирование на языке Паскаль Файлы с последовательным доступом. Кулебякин В.В.
Глава 9. ВВОД-ВЫВОД ДАННЫХ И ФАЙЛОВАЯ СТРУКТУРА Логический и физический файлы Типы файловой переменной Общие процедуры работы с файлами Текстовые файлы.
Составные типы данных Лекция 8-9. Ломаско Павел Сергеевич9 августа 2012 г.
Тема урока Переменная. Тип данных. Ввод и вывод данных.
Транксрипт:

Работа с файлами Материал и презентация:Сазонов Д.О. ПМиЭММ

Файлом можно назвать любые данные, записанные на внешний носитель, объединенные одним именем Как OS представляет файл? В начале диска создается так называемая ТАБЛИЦА РАЗМЕЩЕНИЯ ФАЙЛОВ (File Allocation Table), в программировании просто называемая FAT. В данной таблице как раз содержится информация о файлах. Если быть точнее, то имя файла, его длинна, его атрибуты и номер по которому файл размещен на диске. Собственно говоря вы можете для примера загрузить программу DE (Disk Editor) из комплекта Norton Utilites. То, что вы там увидите и будет FAT. Например: ext2 fat32 vfat ntfs cdfs

Имя Рас Размер Дата Время Кластер Арх Т/Ч Сис Скр Кат Том IO DOS :22 am 2 Т/Ч Сис Скр MSDOS DOS :22 am 4 Т/Ч Сис Скр NIMNUL :46 pm 0 Арх Том хCANDISK LOG :58 pm 14 Арх AT.e.m.p :63 pm 0 Т/Ч Сис Скр Том TEMP :11 pm 3599 Кат CONFIG SYS :38 pm 765 Арх AU.s.e.r.s :63 pm 0 Т/Ч Сис Скр Том USERS :16 pm 178 Кат QUIZ :53 pm 1091 Кат BOOTLOG PRV :28 pm 11 Арх Скр LINUX :35 am 13 Кат Ag.a.m.e.s :63 pm 0 Т/Ч Сис Скр Том GAMES :05 pm 5676 Кат AUTOEXEC BAT :38 pm 799 Арх Т/Ч MSDOS SYS :04 pm 811 Арх Т/Ч Сис Скр BOOTLOG TXT :27 pm 9 Арх Скр SUHDLOG DAT :17 pm Т/Ч Скр Когда пользователь хочет что либо сделать с файлом и дает об этом знать машине, компьютер сначала ищет имя этого файла в FAT, затем по имени определяет где этот файл начинается и сколько занимает - его начало и длину, ну а дальше все просто - загружается файл и с ним выполняются какие-либо действия из выше перечисленных. Теперь вы догадались, почему в одном каталоге не может быть два файла с одинаковыми именами? Собственно говоря, даже если такое и произойдет (в результате вмешательства опытного пользователя), то работать можно будет только с тем файлом, который находится первым по списку.

Логический и физический файл. Для удобства разделим файлы на две группы. Первая группа - это физический файл. Файл который реально находится на диске, и вообще любой файл. Логическим же файлом назовем файл с которым будем работать в программе, но как только мы выйдем из среды программирования или же перестанем работать с этим файлом он станет физическим. Зачем нужно такое разделение? Дело в том, что все фалы на диске всегда представляют собой однотипную последовательность данный, где каждому элементу этих данных соответствует только одна ячейка. (вспомните массивы). Получается, что каждый файл это массив var test_file:array[1..n] of char; Но, что делать, если нам нужно поместить в файл число типа integer или real, или какой-нибудь другой тип. Для этого в программе указывают тип данных которые, якобы будут записываться в файл, например integer (целый тип). Далее записывают элементы- если подумать логически, то раз в файл записываются элементы типа integer, то и сам файл тоже будет иметь этот тип. Но на самом деле это не так. Так как на каждое число в файле выделена одна ячейка, никак нельзя записать две. По этому каждое число разбивается на несколько частей. Этой разбивкой занимается компилятор и нам не надо об этом заботится, достаточно записать в файл любого типа, а компилятор сам преобразует его. Продемонстрировать это можно так (грубый пример).

Допустим дан файл: В каждой ячейке может поместиться только один символ. Это есть физический файл. Логический файл мы создаем, когда присваиваем файловой переменной тип файла. В Pascal: a: file of integer; Теперь мы записываем в него число, например 42 и число 76. Если бы это был массив, было бы: Задача же компилятора состоит в том, чтобы преобразовать число из двух символов в два числа по одному символу в каждом. По этому файл будет выглядеть так: Если приглядеться, то можно увидеть, что при записи в файл двух символов, компилятор меняет из местами

Как и в других языках высокого уровня в языке PASCAL заложена работа с файлами. Надо отметить, что во всех языках программирования работа с файлами представляет собой примерно одно и то же, различаясь только разными подходами и разными командами. По своей же сути файлы обрабатываются одинаково во всех языках. На данном моменте нашей задачей будет являться рассмотреть, посредством чего PASCAL взаимодействует с файлами и файлом в целом. Поскольку PASCAL структурный язык прежде всего нам придется узнать как описывается файл и что представляет собой этот тип данных. Прежде всего начнем с того, что PASCAL может работать с тремя видами логических файлов: текстовые файлы, типизированные файлы, и файлы без типа. Соответственно в текстовых файлах записывается и считывается текстовые строки (например можно записать туда какое-нибудь послание). Типизированные файлы предназначены для записи в них определенного типа данных (поскольку язык PASCAL сам по себе типизированный - у каждой переменной должен быть свой тип, обойтись без типизированных файлов обойтись было бы крайне тяжело). Файл без типа представляет собой - физический файл на диске Представление файлов в PASCAL

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

Описание файлов Поскольку в PASCAL все переменные должны быть описаны в заголовке, соответственно файловые переменные должны быть описаны там же. Например: VAR f: file; T: text; Fi,Fi1,Fi2: file of integer; Fr: file of real; Fw,Fw2: file of word; Fb: file of byte; Чтобы не запутаться при составлении большой программы рекомендую вам обозначать файловые переменные с буквы f (или с Т - если файл текстовый).На практике в учебном же процессе Вам скорей всего не придется работать с файлами без типа. Если файл без типа то переменные будут f1,f2,f3,…… Если файл типизированный, то разумно после буквы f указывать первую букву типа файла, как это делалось в примере выше.

Связь файловой переменной с физическим файлом После того как мы описали файловую переменную, мы прошли только 1/3 пути т.к. описанием мы только сказали компилятору, что у нас будет какой-то файл и за него будет "отвечать" конкретная переменная. (дали переменной тип). Следующим шагом будет связь переменной с конкретным файлом, находящимся на дискете или винчестере. После этого файловая переменная примет номер файла. И далее, чтобы обратиться к файлу (записать или считать из него), нам будет достаточно обратиться к файловой переменной отвечающей за этот файл. И наконец, когда компилятор знает какая переменная с каким файлом связана, нам надо сказать, что мы будем делать с файлом. (записывать, считывать из него и т.д.). На практике это будет выглядеть так: Var f: file of integer; ….. Begin …… Assign(f,'имя файла'); Reset(f); …. End.

Давайте теперь рассмотрим подробнее, что есть что. Вы уже наверное догадались, что связь с физическим файлом выполняется посредством оператора ASSIGN. Кроме этого у ASSIGN есть два обязательных параметра: первый - это переменная с которой связывается файл, а второй - это взятое в кавычки имя файла с которым будет происходить работа. Причем имя файла может также содержать путь к файлу. Например: Assign(f,'f2.txt'); После того, как мы связали переменную и файл, надо сказать компилятору что мы будем делать с файлом, для этого сразу после оператора Assign следует написать один из следующих операторов: RESET(имя файловой переменной) REWRITE(имя файловой переменной) APPEND(имя файловой переменной) RESET - говорит о том, что мы связали переменную с файлом для того, чтобы что либо записать или прочитать из него. Иными словами открыть для чтения/записи (используется чаще всего). REWRITE - говорит о том, что файл надо создать заново на диске т.е. если такого файла не было то он создается, если был то стирается. APPEND - сообщает компилятору, что все последующие записи в файл будет добавлены к его концу таким образом файл будет расти, но при этом в него можно только записывать. Теперь когда вы знаете как открыть файл и начать работу с ним нелишне будет сказать, что ВСЕГДА после работы с файлом его обязательно надо закрыть. Особенно это относится к случаю когда что-нибудь записывается в файл. Оператор который это делает называется CLOSE и в качестве параметра ему надо передать имя файловой переменной. Например: CLOSE(f);

Запись и чтение из файла Изначально файлы были придуманы для хранения, добавления, стирания и обработки различной информации по этому самым важным моментом при работе с файлами является запись информации в файл и чтение из него. Для чтения и записи существует несколько процедур и функций в PASCAL, но пока нас будут интересовать только две, которые Вам уже давно известны. Это READ и WRITE. Соответственно READ читает информацию из файла, а WRITE - записывает в него. Формат этих команд следующий: READ (имя файловой переменной, переменная в которую будет производиться чтение) WRITE(имя файловой переменной, переменная значение которой запишется в файл) Естественно, что пользоваться READ и WRITE можно только после того, как файловая переменная связана с конкретным файлом с помощью ASSIGN.

Примеры: запись в файл VAR fi: file of integer; I:integer; Begin Assign(fi,'test.tmp'); Reset(fi); I:=3; Write(fi,i); I:=2; Write(fi,i); I:=1; Write(fi,i); Close(fi); End; Тоже самое можно сделать с помощью цикла VAR fi: file of integer; I:integer; Begin Assign(fi,'test.tmp'); Reset(fi); For i:=3 downto 1 do Write(fi,i); Close(fi); End. Чтение из файла VAR fi: file of integer; I:integer; Begin Assign(fi,'test.tmp'); Reset(fi); Read(fi,i); Write(i); {Вывод содержимого файла на экран} Read(fi,i); Write(i); Read(fi,i); Write(i); {в принципе при чтении файла CLOSE можно не использовать} Close(fi); End; Чтение с помощью цикла VAR fi: file of integer; I,j:integer; Begin Assign(fi,'test.tmp'); Reset(fi); For i:=1 to 3 do begin Read(fi,j); Writeln(j); End; Close(fi); End.

Почему READ и WRITE? А действительно почему мы пользуемся одними и теми же операторами для печати на экран и вывода в файл, для чтения символа с клавиатуры и чтения из файла? По сути дела получается что существует два READ и два WRITE. Первые из которых имеют всего один параметр, а вторым требуется два. С точки зрения языка PASCAL такое недопустимая ошибка - нельзя чтобы были две одинаковых процедуры с разным или даже одинаковым количеством параметров. Так в чем же тогда дело? Оказывается компилятор Паскаля считает клавиатуру и экран дисплея тоже файлами. Причем у этих "файлов" даже есть имена: клавиатура называется input, а экран монитора output. Далее приведем две совершенно различные конструкции которые на самом деле являются одним и тем же. Var f:file; Begin Assign(f,'ountput'); Reset(f); Write(f,'Hello world!'); Close(f); End.

Вся эта программа может быть заменена всего одним оператором: Write('Hello world!'); Точно также работает и read. Вывод: по умолчанию для вывода используется конструкция Write(output, ), а для ввода Read(input, ), где output и input файлы. В начале программы как и всем файлам в PASCAL output и input должно присваиваться имя физического файла, но так как монитор и клавиатура не является физическим файлом на диске им не присваивается ничего т.е. выполняется следующие команды: Для вывода Assign(output,''); Rewrite(output); Для ввода данных Assign(input,''); Rewrite(input); Тем не менее мы можем связать клавиатуру и экран монитора с физическим файлом на диске. Такая связь называется в программировании перенаправлением ввода. Для этого нам надо указать имя файла в операторе Assign. В этом случае вывод будет происходит в файл, а вывод из файла.

Текстовые файлы Как было сказано выше текстовые файлы хранят в себе различные данные имеющие тип string или char. Даже в разделе описания переменных файлы такого типа описываются иначе остальных: вместо file пишется text. Например: Var t,t1: text; Хорошим примером текстового файла может являться монитор. В текстовом файле как и на экране монитора все будет записываться так как оно выглядит на экране. Иными словами это простое перенаправление ввода с монитора в файл. Две следующие программы аналогичны. С типом файла TEXT: uses crt; var t:text; begin clrscr; {вывод на экран монитора} write('один'); writeln(' два'); writeln('три'); {Вывод в текстовый файл} assign(t,'text.tmp'); rewrite(t); write(t,'один'); writeln(t,' два'); writeln(t,'три'); close(t); end. C перенаправлением ввода: uses crt; begin clrscr; {вывод на экран монитора} write('один'); writeln(' два'); writeln('три'); {переопределяем вывод на вывод в файл} assign(output,'screen.tmp'); rewrite(output); write('один'); writeln(' два'); writeln('три'); close(output); end.

Ввод же из файла осуществляется точно так же как и ввод и с клавиатуры, за исключением того, что Вам не придется нажимать на клавиши все правила ввода с клавиатуры справедливы и ввода с файла. Правда, это только для текстовых файлов. Приведем пример ввода: Но для начала надо создать текстовый файл. Для этого воспользуемся одной из приведенных выше программ. В профессиональной практике при работе с текстовыми файлами предпочтительнее использовать вторую программу с перенаправлением ввода, поскольку она не требует описания файловой переменной, а работа с самим файлом выглядит привычнее. uses crt; begin clrscr; {переопределяем вывод на вывод в файл} assign(output,'prim.tmp'); rewrite(output); writeln(' '); write('15'); close(output); end. Мы записываем в файл prim.tmp числа и на следующей строке число 15. Если бы мы все это вводили с клавиатуры (через READ), то проделали бы следующие действия. 10 пробел 12 пробел 21 пробел 56 пробел 42 ENTER 15 ENTER. Теперь, при считывании текстового файла за нас это проделает компьютер. Не забывайте, что чтение текстового файла - это лишь перенаправление ввода клавиатуры.

uses crt; var a:integer; begin clrscr; assign(input,'prim.tmp'); {Перенаправляем ввод из файла на клавиатуру } reset(input); read(a); {Считали первое число} write(a,' '); {вывели на экран число и пробел, чтобы числа не сливались друг с другом.} read(a); write(a,' '); read(a); write(a,' '); read(a); write(a,' '); readln(a); {перешли на строчку ниже. (в фале)} writeln(a,' '); {Отступили строчку на экране монитора и вывели число} read(a); write(a,' '); end. Как вы уже, наверно, заметили в текстовых файлах можно хранить и числа, причем отделяются числа друг от друга пробелом. И читать их можно с помощью read, а чтобы перейти к следующей строчке необходимо использовать readln. Тоже самое относится и к выводу текстовых файлов.

Пример 1.Записать в текстовый файл одномерный массив из 10 элементов и вывести содержимое текстового файла. uses crt; var a:array[1..10] of integer; i,k:integer; begin clrscr; {заполняем массив произвольными числами} for i:=1 to high(a) do begin a[i]:=random(100); write(a[i],' '); end; {перенаправляем ввод} assign(output,'prim.tmp'); rewrite(output); {вывод массива в файл который связан с экраном монитора} for i:=1 to high(a) do write(a[i],' '); close(output); {теперь прочитаем содержимое файла} {А чтобы вывод содержимого был на экран, а не в файл надо опять перенаправить вывод, но на сей раз на экран} assign(output,''); rewrite(output); assign(input,'prim.tmp'); reset(input); writeln; writeln('Содержимое файла:'); for i:=1 to high(a) do begin read(k); write(k,' '); end; readln; end. Пример 2. Записать в текстовый файл одномерный массив из 10 элементов и вывести содержимое текстового файла. При этом не использовать перенаправление вывода. Решить задачу с помощью файловой переменной. uses crt; var a:array[1..10] of integer; i,k:integer; t:text; begin clrscr; {заполняем массив произвольными числами} for i:=1 to high(a) do begin a[i]:=random(100); write(a[i],' '); end; {присваиваем файловой переменной физическое имя файла} assign(t,'prim.tmp'); rewrite(t); {вывод массива в файл} for i:=1 to high(a) do begin write(t,a[i]); {для отделения чисел друг от друга} write(t,' '); end; close(t); {теперь прочитаем содержимое файла} assign(t,'prim.tmp'); reset(t); writeln; writeln('Содержимое файла:'); for i:=1 to high(a) do begin read(t,k); write(k,' '); end; readln; end.

Стандартные процедуры и функции для работы с файлами FilePos(файловая переменная) - возвращает текущую позицию в файле. Пример:.... Writeln(FilePos(fi)); FileSize(файловая переменная) - возвращает общую длину файла в байтах Пример:.... Writeln(FileSize(fi)); Truncate(файловая переменная) - удаляет все от текущей позиции в файле и до конца файла. Seek(файловая переменная, позиция) - устанавливает позицию указателя в файле.

Дополнительные процедуры и функции для работы с файлами Для того, чтобы использовать дополнительные возможности работы с файлами необходимо подключить дополнительный модуль под названием WinDos в раздел USES начала программы. Например: Uses crt, windos; Данный модуль дает возможность работать с функциями и процедурами операционной системой MS DOS. Exec(имя программы,''); - выполняет заданную программу при учете, что хватит памяти для выполнения. Например: Exec('j:\d\lang\tp7\test.com',''); Exec('test.exe', ''); DosVersion - возвращает текущую версию MS DOS. Пример: Writeln(DosVersion);

DiskFree(номер дискового устройства) - возвращает количество свободного места на диске. Номер устройству определяется по правилу: 0 - текущее устройство (которое работает в данный момент) 1 - Дисковод 3,5`` 2 - Второй дисковод 3.5`` (если он есть) 3 - Винчестер - диск С. 4 - Диск D и и.д. Функция возвращает (- 1) - если устройства не существует. Например: Write('Введите номер устройства:'); Readln(N); If DiskFree(N)=-1 then writeln('Устройства не существует') else Writeln('Свободно:', DiskFree(N));

Успехов Вам!