Скачать презентацию Программирование на ЭВМ Лекция 5 Файлы Доцент к Скачать презентацию Программирование на ЭВМ Лекция 5 Файлы Доцент к

05 Программирование на ЭВМ - файлы.pptx

  • Количество слайдов: 32

Программирование на ЭВМ Лекция 5. Файлы Доцент, к. т. н. Исаев А. В. avisz@yandex. Программирование на ЭВМ Лекция 5. Файлы Доцент, к. т. н. Исаев А. В. avisz@yandex. ru Ауд. 7 или 234

Файлы • Физический файл — это именованная область внешней памяти, содержащая какую-либо информацию. Физический Файлы • Физический файл — это именованная область внешней памяти, содержащая какую-либо информацию. Физический файл существует на некотором материальном носителе информации (запоминающем устройстве); • Логический файл — одна из структур данных, используемых в программировании. Такой файл существует только в логическом представлении при написании программы. В программах логические файлы представляются файловыми переменными определенного типа.

Структура файлов • Структура физического файла представляет собой простую последовательность байтов памяти носителя информации. Структура файлов • Структура физического файла представляет собой простую последовательность байтов памяти носителя информации. • Структура логического файла в принципе похожа на структуру массива. Различия между массивом и файлом заключаются в следующем: – У массива количество элементов фиксируется в момент распределения памяти, и он целиком располагается в оперативной памяти; – У файла количество элементов в процессе работы программы может изменяться. Количество элементов файла в каждый момент времени не известно. Зато известно, что в конце файла располагается специальный символ конца файла EOF (расшифровывается как End of File, т. е. «конец файла» ), в качестве которого используется управляющий символ ASCII с кодом 26.

Файлы Три характерные особенности физического файла: 1. У файла есть имя. Это дает программе Файлы Три характерные особенности физического файла: 1. У файла есть имя. Это дает программе возможность работать с несколькими файлами 2. Файл содержит данные одного типа. Типом данных в файле может быть любой тип Delphi/Pascal, кроме файлов 3. Объем создаваемого файла ограничено только емкостью устройств внешней памяти (то есть, никак не оговаривается дополнительно)

Описание файла в Pascal • Как и любая структура данных (переменная, массив) программы, файл Описание файла в Pascal • Как и любая структура данных (переменная, массив) программы, файл должен быть объявлен в разделе описания переменных. При объявлении файла указывается тип элементов файла. • В зависимости от способа объявления можно выделить три вида файлов: <имя>=file of <тип>; // типизированные файлы <имя>=Text. File; // текстовые файлы <имя>=file; // нетипизированные файлы • Здесь <имя> — имя файловой переменной (правильный идентификатор); File, of — ключевые слова (файл, из); Text. File — имя стандартного типа текстовых файлов; <тип> — любой тип Delphi/Pascal, кроме файлов.

Например var f 1: file of char; f 2: textfile; f 3: file; f Например var f 1: file of char; f 2: textfile; f 3: file; f 4: file of string[80]; • По сути, в разделе описания мы создаем логический файл. • В Delphi нету каких-либо средств контроля вида созданных файлов. Программист должен сам следить за соответствием вида объявленного файла характеру хранящихся в файле данных.

Файловая переменная и связь файла с ней • Объявление файловой переменной задает только тип Файловая переменная и связь файла с ней • Объявление файловой переменной задает только тип компонентов файла. Для работы с физическим файлом, находящимся на внешнем носителе, необходимо сначала связать его с файловой переменной (логическим файлом), с помощью которой будет осуществляться доступ к этому физическому файлу. • Можно рассматривать файловую переменную как манипулятор, с помощью которого осуществляются все операции с физическим файлом.

Доступ к файлам Общий порядок работы с файлами: 1. Связь файловой переменной с именем Доступ к файлам Общий порядок работы с файлами: 1. Связь файловой переменной с именем файла) 2. Открытие файла 3. Операции над файлом (чтение, запись и т. п. ) 4. Закрытие файла. • Файлы становятся доступны программе только после операции связывания ранее объявленной файловой переменной с именем существующего или вновь создаваемого файла, а также после указания направления обмена информацией: чтение из файла или запись в него.

Связывание файловой переменной с именем файла • Файловая переменная связывается с именем файла с Связывание файловой переменной с именем файла • Файловая переменная связывается с именем файла с помощью стандартной процедуры Assign. File: Assign. File (<файловая_переменная>, <имя_файла>); • Здесь файловая_переменная — правильный идентификатор, объявленный в программе как переменная файлового типа), имя_файла — текстовое выражение, состоящее из имени файла и, если надо, пути к нему (имя диска, каталогов и подкаталогов).

Примеры Program f 1; var f, f 1, f 2: textfile; fname: string; begin Примеры Program f 1; var f, f 1, f 2: textfile; fname: string; begin … Assign. File(f, 'a: result. txt'); Assign. File(f 1, 'studentsivanovkorni. txt'); … fname: =('otchet. txt'); Assign. File(f 2, fname); … end.

Открытие файла • Перед выполнением операций чтения и записи файл должен быть открыт (инициализирован). Открытие файла • Перед выполнением операций чтения и записи файл должен быть открыт (инициализирован). • Открытие (инициализация) файла — это указание для файла направления передачи данных. В Delphi/Pascal можно открыть файл для чтения, для записи информации, или для чтения и записи одновременно.

Открытие и закрытие типизированных и текстовых файлов • • Открытие файла выполняется процедурами Reset Открытие и закрытие типизированных и текстовых файлов • • Открытие файла выполняется процедурами Reset и Rewrite, а закрытие — процедурой Close. Reset(f); Rewrite(f); Close(f); Здесь f — имя файловой переменной, связанной ранее процедурой Assign. File с уже существующим файлом. • reset(f); — открывает уже существующий файл; • • rewrite (f); — создает новый файл. Если такой физический файл уже существует, то он удаляется, и на его месте создается новый пустой файл. close(f); — закрывает файл, однако связь файловой переменной f с именем файла, установленная ранее процедурой assignfile, остается. Поскольку эта связь сохраняется, файл можно повторно открыть без дополнительного использования процедуры Assignfile. • Закрытие файла после завершения работы с ним является обязательным!

Особенности команды Reset • Процедура Reset(f); открывает существующий физический файл, который был связан с Особенности команды Reset • Процедура Reset(f); открывает существующий физический файл, который был связан с файловой переменной f. • Если f — типизированный файл, то он будет доступен как для чтения, так и для записи. • Если же f — текстовый файл, то с помощью команды Reset(f); его можно открыть только для чтения. • При открытии любого файла указатель текущей позиции файла устанавливается в его начало.

Режимы открытия текстовых файлов • Для того чтобы открыть текстовый файл в режиме создания Режимы открытия текстовых файлов • Для того чтобы открыть текстовый файл в режиме создания нового файла или замены существующего, необходимо вызвать процедуру Rewrite(f); где f — файловая переменная типа Text. File. • Для того, чтобы открыть текстовый файл в режиме добавления к уже существующим данным, находящимся в этом файле, нужно вызвать процедуру Append(f); где f — файловая переменная типа Text. File.

Нетипизированные файлы • Нетипизированные файлы — это последовательность компонентов произвольного типа. • Открытие нетипизированного Нетипизированные файлы • Нетипизированные файлы — это последовательность компонентов произвольного типа. • Открытие нетипизированного файла: Reset(f, Block. Size); или Rewrite(f, Block. Size); • Параметр Block. Size задает число байтов, считываемых из файла или записываемых в него за одно обращение. Минимальное значение Block. Size — 1 байт, максимальное — 64 Кбайт. Если Block. Size не указан, то по умолчанию он принимается равным 128 байт.

Текстовый файл Типизированный файл Нетипизированный файл Var tx: Text. File; Var tp: file of Текстовый файл Типизированный файл Нетипизированный файл Var tx: Text. File; Var tp: file of <тип>; var nf: file; Begin Assign. File(ф. п, имя); --- открыть --Reset(tx); (открыть существующий файл только для чтения) Reset(tpf); Reset(nf, blocksize); Открыть существующий файл для чтения и файл только для чтения записи Rewrite(tx); Создать новый файл Rewrite(tp); Создать новый файл Append(tx); Открыть существующий файл для записи (добавления данных) в конец файла --- Закрыть --Close(ф. п. ); Rewrite(nf, blocksize); Создать новый файл

Функции для работы с файлами • eof (f)— признак конца файла. Возвращает true, если Функции для работы с файлами • eof (f)— признак конца файла. Возвращает true, если указатель стоит в конце файла. При записи это означает, что новые данные будут добавлены в конец файла, при чтении — что файл исчерпан. • erase(f) — уничтожает файл f. Перед выполнением этой процедуры необходимо закрыть файл. • fileexists(filename) — возвращает true, если файл с указанным именем (и, если надо, маршрутом) существует.

Вывод в текстовый файл • Непосредственно вывод в текстовый файл осуществляется при помощи команды Вывод в текстовый файл • Непосредственно вывод в текстовый файл осуществляется при помощи команды write или writeln. В общем виде эти инструкции записываются следующим образом: write(Файловая_Переменная, Список_Вывода) ; writeln(Файловая_Переменная, Список_Вывода); • где: • Файловая_Переменная — переменная, идентифицирующая файл, в который выполняется вывод; • Список_Вывода — разделенные запятыми имена переменных, значения которых надо вывести в файл. Помимо имен переменных в список вывода можно включать строки, заключенные, как обычно, в апострофы.

Например • Если переменная f является переменной типа Text. File, то команда вывода значений Например • Если переменная f является переменной типа Text. File, то команда вывода значений переменных x 1 и х2 в файл может быть такой: write(f, 'Корни уравнения', x 1, х2); • Различие между инструкциями writeln состоит в том, что инструкция writeln после вывода всех значений, указанных в списке вывода, записывает в файл символ «новая строка» .

Чтение данных из текстового файла • Чтение из текстового файла выполняется при помощи инструкций Чтение данных из текстового файла • Чтение из текстового файла выполняется при помощи инструкций read и readln, которые в общем виде записываются следующим образом: read(ФП, Список_Переменных); и readln(ФП, Список_Переменных); где: • ФП — переменная типа Text. File; • Список_Переменных — имена переменных, разделенные запятыми.

Чтение чисел из текстового файла • Следует понимать, что в текстовом файле находятся не Чтение чисел из текстового файла • Следует понимать, что в текстовом файле находятся не числа, а их изображения (т. е. символы). Действие, выполняемое инструкциями read или readln, фактически состоит из двух: сначала из файла читаются символы до появления разделителя (пробела или конца строки), затем прочитанные символы, являющиеся изображением числа, преобразуются в число, и полученное значение присваивается переменной, имя которой указано в качестве параметра команды read или readln. • Если при чтении значения численной переменной в файле вместо цифр (или знаков – и. ) будет какая-то другая последовательность символов, то произойдет ошибка.

Например Если текстовый файл 'c: data. txt' содержит следующие строки: 23 -15 45 28 Например Если текстовый файл 'c: data. txt' содержит следующие строки: 23 -15 45 28 56 71 то в результате выполнения инструкций: Assign. File(f, 'c: data. txt'); Reset(f); // открыть для чтения read(f, а); read(f, b, с); read(f, d); значения переменных будут следующими: а = 23 b = -15 с = 45 d = 28.

Продолжение примера • Отличие инструкции readln от read состоит в том, что после считывания Продолжение примера • Отличие инструкции readln от read состоит в том, что после считывания из файла очередного числа и присвоения полученного значения переменной, имя которой стоит последним в списке параметров инструкции readln, указатель чтения из файла автоматически перемещается в начало следующей строки файла, даже в том случае, если за прочитанным числом есть еще числа. • Поэтому в результате выполнения инструкций (для того же примера) Assign. File(f, 'c: data. txt'); 23 -15 Reset(f); 45 28 readln(f, a); 56 71 readln(f, b, c); readln(f, d); значения переменных будут следующими: а = 23, b = 45, с = 28, d = 56.

Чтение строк • В программе строковая переменная может быть объявлена с указанием длины или Чтение строк • В программе строковая переменная может быть объявлена с указанием длины или без нее. • Например: stroka 1: string[10]; stroka 2: string; • При чтении из файла значения строковой переменной, длина которой явно задана в объявлении, считывается столько символов, сколько указано в объявлении, но не больше, чем в текущей строке. • При чтении из файла значения строковой переменной, длина которой явно не задана в объявлении переменной, значением переменной становится оставшаяся последнего чтения часть текущей строки. Другими словами, если надо прочитать из файла всю строку, то надо объявить строковую переменную, длина которой заведомо больше самой длинной строки файла, и считывать строки в эту переменную.

Чтение строк • Если одной инструкцией readln осуществляется ввод нескольких, например, двух строковых переменных, Чтение строк • Если одной инструкцией readln осуществляется ввод нескольких, например, двух строковых переменных, то первая переменная будет содержать столько символов, сколько указано в её объявлении или, если длина не указана, всю строку файла. Вторая переменная будет содержать оставшиеся символы текущей строки или, если таких символов нет, не будет содержать ни одного символа (длина строки равна нулю).

Прочие функции для работы с файлами • Для типизированных файлов: • Seek(f, x); — Прочие функции для работы с файлами • Для типизированных файлов: • Seek(f, x); — перемещает указатель текущей позиции в файле на элемент с заданным номером x (при счете от нуля); • Truncate(f, z); — усекает размер файла до текущей позиции • File. Pos(f); — возвращает номер текущей позиции указателя в файле (позиции нумеруются от нуля!); • File. Size(f); — возвращает текущей размер файла (число элементов файла); • Для текстовых файлов: • Seek. Eof(f); — возвращает для текстового файла состояние Eof — конец файла; • Seek. Eoln(f); — возвращает для текстового файла состояние Eoln — конец строки;

Работа с нетипизированными файлами • Чтение данных из нетипизированного файла (высокоскоростная процедура): Block. Read(f, Работа с нетипизированными файлами • Чтение данных из нетипизированного файла (высокоскоростная процедура): Block. Read(f, X, Count, Quant. Block); • Эта процедура осуществляет за одно обращение чтение в переменную X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера, указанного при открытии нетипизированного файла (см. выше). Значение Count не может быть меньше 1. За одно обращение нельзя прочесть больше, чем 64 Кб. • Необязательный параметр Quant. Block возвращает число блоков, прочитанных текущей операцией Block. Read. В случае успешного завершения операции чтения Quant. Block = Count, в случае аварийной ситуации параметр Quant. Block будет содержать число удачно прочитанных блоков. Отсюда следует, что с помощью параметра Quant. Block можно контролировать правильность выполнения операции чтения.

Работа с нетипизированными файлами • Запись данных в нетипизированный файл (высокоскоростная процедура): • Block. Работа с нетипизированными файлами • Запись данных в нетипизированный файл (высокоскоростная процедура): • Block. Write(f, X, Count, Quant. Block); • Эта процедура осуществляет за одно обращение запись из переменной X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера, указанного при открытии нетипизированного файла (см. выше). • Необязательный параметр Quant. Block возвращает число блоков, записанных успешно текущей операцией Block. Write. • Для нетипизированных файлов можно использовать процедуры Seek, FIle. Pos и File. Size, аналогично соответствующим процедурам типизированных файлов.

Работа с каталогами и файлами • getdir(d, s) — определяет имя текущего каталога на Работа с каталогами и файлами • getdir(d, s) — определяет имя текущего каталога на указанном диске и сохраняет его в строковую переменную s. Если d равно 0, возвращает текущий путь; • chdir(d); — изменяет текущий каталог на указанный (d — типа string), • mkdir(d); — создает новый каталог d с указанным именем (d — типа string) • rmdir(d); уничтожает каталог при условии, что он пустой (d — типа string). • rename(f, newname) служит для переименования файла или каталога. Второй параметр newname — строкового типа, указывает новое имя файла или каталога.

Пример • Пользователь вводит с клавиатуры имя файла (без пути к нему и расширения; Пример • Пользователь вводит с клавиатуры имя файла (без пути к нему и расширения; предполагается, что файл должен храниться на диске C: в корневом каталоге и иметь расширение. txt). • После чего происходит проверка — существует ли уже такой файл на диске. Если его нет, то файл создается, в него записывается строка «Начало нового файла» , а на экран выводится сообщение «Создан новый файл» . Если же файл уже существует, то в него добавляется строка «Новая строка!» , а на экран выводится сообщение «В файл добавлена новая строка» .

program Filedemo; var f: textfile; filename, path, name, ext: string; begin path: ='C: '; program Filedemo; var f: textfile; filename, path, name, ext: string; begin path: ='C: '; ext: ='. txt'; writeln('Введите имя файла: '); readln(name); filename: =path+name+ext; assignfile(f, filename); if not fileexists(filename) then begin rewrite(f); writeln('Создан новый файл'); // выводим на экран! writeln(f, 'Начало нового файла'); // выводим в файл! end else begin append(f); writeln(f, 'Новая строка!'); // выводим в файл! writeln('В файл добавлена новая строка'); // выводим на экран! end; close(f); end.

Спасибо за внимание! Спасибо за внимание!