Файлы. Виды файлов
Файлом называется область памяти жесткого диска, имеющая свое имя.
Число компонент файла может изменяться (увеличиваться или уменьшаться), то есть заранее не фиксируется. Поэтому в них можно хранить достаточно большое количество данных. После каждого элемента автоматически ставится признак конца элемента, а в конце файла ставится признак конца файла.
Один и тот же физический файл можно по-разному представить в программе. Язык Турбо Паскаль предлагает три вида такого представления:
И Вы, в зависимости от решаемой задачи, вольны выбирать один их трех видов, а может быть и несколько. Но чтобы определиться, Вы должны хорошо знать не только процедуры и функции, являющиеся общими для всех видов файлов, но и специфичные для каждого вида.
Типизированный файл – последовательность элементов одного типа.
Описание файлового типа имеет синтаксис:
Допустим, мы имеем дело с файлом, в котором записываются переменные типа Word, тогда переменная файлового типа может быть введена двояко: с явным объявлением файлового типа:
Как открыть архив RAR, ZIP и другие?
WordFile = file of word;
или без объявления файлового типа:
MyFile : file of word
Приведем примеры переменных файлового типа с другими объявлениями.
Name, SerName : string;
Sessia : array [1..10] of byte;
VarFile1 : file of char;
VarFile2 : file of Student;
VarFile3 : file of string;
Файловые переменные имеют специфическое применение. Над ними нельзя выполнять никаких операций (присваивать значение, сравнивать и др.). Их можно использовать только для выполнения операций с файлами (чтения, записи, удаления файла и т.д.). кроме того, через файловую переменную можно получить информацию о конкретном файле (тип, параметры, имя файла и т.д.).
С каждым файлом можно связать понятие текущий указатель. Это неявно описанная переменная, которая указывает на конкретный элемент файла. Действия с файлами производятся поэлементно, причем в них участвует тот элемент, на который «смотрит» текущий указатель, перемещающийся в результате выполнения действия на следующий элемент.
Переменные файлового типа используются в программе только в качестве параметра собственных и стандартных процедур и функций. Все фактические действия с файлами основаны на наборе стандартных процедур языка, входящих в состав модулей System и Dos.
Алгоритм работы с файлами
1. До начала работы с файлами устанавливается связь файловой переменной МуFilе с именем дискового файла. Очень важно различать собственно файл (область памяти на магнитном носителе с некоторой информацией) и переменную файлового типа в некоторой Turbo Pascal-программе. Считается, что файловая переменная является представителем некоторого дискового файла в программе.
Для того, чтобы реализовать доступ к файлу на магнитном диске, программа должна связать его с файловой переменной. Для этого необходимо сопоставить переменную с именем файла. Это имя представляется в виде строки, содержащей полное имя файла и, может быть, маршрута к файлу, который формируется по общим правилам MS-DOS.
КАК УСТРОЕН EXE ФАЙЛ?
assign (МуFilе, ‘с:МуDirectoryResult.dat’); — здесь приведено полное (с указанием пути) имя пользовательского файла Result.dat.
Не разрешается связывать с одним физическим файлом различные файловые переменные в программе. Процедура assign не должна использоваться для открытого файла.
До тех пор, пока файловая переменная не связана с каким-либо дисковым файлом, никакие операции с ней в программе невозможны. Заметим, что можно связать файловую переменную с еще не существующим дисковым файлом. Это делается в случае последующего создания Turbo Pascal-программой файла с данным именем с помощью специальной системной процедуры.
2. После того, как файловая переменная с помощью процедуры a ssign связана с конкретным дисковым файлом, можно выполнить любую допустимую операцию с ним.
Открытие нового файла для записи производится процедурой, единственный аргумент которой – переменная файлового типа, например: rewrite (МуFilе). Следует запомнить, что процедура rewrite обнулит файл, если файл с таким именем уже есть в рабочем каталоге, поэтому при выборе имен файлов соблюдайте осторожность.
Подготовку существующего файла для чтения и записи выполняет процедура reset (МуFilе). Эта процедура ищет уже существующий файл на диске и открывает его для работы, помещая указатель в начальную позицию.
3. Все файлы, открытые в результате работы программы, должны быть закрыты при завершении программы процедурой closе (МуFilе);
При выполнении этого оператора закрывается физический файл на диске и фиксируются изменения, связанные с использованием данного файла. Обратите внимание на необходимость закрытия файлов во всех ветвях программы, в том числе в различных аварийных ситуациях. Незакрытые файлы нарушают файловую структуру на диске, что может приводить к серьезным проблемам с настройкой компьютера.
Запись в файл производится процедурой write (МуFilе, var1, var2, . varN). Первый аргумент этой процедуры – переменная файлового типа, далее следует список записываемых переменных, которые должны соответствовать объявленному типу файла. При выполнении этой операции текущий указатель файла смещается на число позиций, равное числу переменных.
Чтение из файла производится аналогичной процедурой: read (МуFilе, var1, var2, . varN). Положение элементов в файле нумеруется, начиная с номера 0 для первого элемента. После последнего элемента файла автоматически записывается признак конца файла.
Процедуры и функции для работы с типизированными файлами
Seek (МуFilе, n) – устанавливает текущий указатель в заданную позицию, где n – требуемое положение указателя (нумерация элементов типизированного файла начинается с нуля).Поэтому, чтобы обратиться к третьему элементу, нужно записать Seek (МуFilе, 2). Seek (МуFilе, 0) – устанавливает указатель в начальной позиции (на первый элемент). Seek (МуFilе, FileSize(МуFilе)) – устанавливает указатель после последнего элемента, то есть на признак конца файла.
FileSize (МуFilе) определяет число элементов в файле. Функция FileSize(МуFilе) возвращает количество элементов типизированного файла МуFilе.
FilePos (МуFilе) – определяет текущую позицию указателя.
ЕОF (МуFilе) — имеет значение Тruе, если указатель указывает на маркер конца файла (End Of file).
Процедуры и функции для работы файлами
R ename (МуFilе, FileName) — изменяет имя файла. Первый аргумент – переменная файлового типа, а второй аргумент – строкового типа – новое имя файла, которое может быть сокращенным или полным (с указанием пути).
T runcate (МуFilе) — уничтожение части файла от текущего положения до конца производится процедурой
E rase (МуFilе) — процедура уничтожает весь файл.
Текстовые файлы
Структура текстовых файлов отличается от структуры обычных файлов (которые представляют из себя линейную последовательность элементов одного типа) тем, что содержимое текстового файла рассматривается как последовательность строк переменной длины, разделённых специальной комбинацией, называемой «конец строки». Как правило, эта комбинация строится из управляющего кода «перевода каретки» (CR, Carriage Return, символ #13), за которым, возможно, следует управляющий код «перевод строки» (LF, Line Feed, символ #10). Признаком конца строки считается нажатие клавиши ввода.
Текстовый файл завершается специальным кодом «конец файла» (символ #26). В большинстве случаев знание конкретной кодировки управляющих символов не обязательно ввиду наличия файловых операций, автоматически учитывающих эти символы.
Таким образом, текстовый файл структурно несколько похож на «файл из байтов» (file of byte) с той разницей, что в нем, помимо содержательной информации, встречаются символы специального назначения.
Его можно схематически представить в следующем виде:
Описанная структура текстовых файлов хорошо согласуется с интуитивно понимаемым построением текстовой информации и полностью совпадает со стандартной структурой текстов, принятой в MS-DOS, используемой во многих текстовых редакторах, понимаемой компиляторами с языков программирования и т.д.
С каждым файлом на диске должна быть связана файловая переменная, которая описывается в соответствии с типом файла на диске. Представителем же текстового файла в Pascal-программе является переменная файлового типа, которая должна быть описана с указанием стандартного типа text:
Слово text не является зарезервированным словом, а считается идентификатором стандартного типа, наряду с идентификаторами integer, real и т.д.
Ввод-вывод для текстовых файлов подчиняется тем же общим правилам, что и для обычных типизированных файлов; однако имеется несколько важных особенностей.
Во-первых , для одного текстового файла нельзя одновременно производить операции и ввода, и вывода. Это означает, что после открытия текстового файла процедурой reset возможно только чтение информации из файла, после процедуры rewrite – только запись в файл.
Во-вторых , обмены с текстовыми файлами всегда являются строго последовательными, то есть после чтения из файла элемента с порядковым номером N следующая операция чтения даст элемент с номером N+1. Иными словами, прямой доступ к любому элементу текстового файла невозможен; для текстовых файлов не допускаются вызовы Seek, FilePos, FileSize.
В третьих , еще одной особенностью работы с текстовыми файлами является возможность непосредственных обменов значениями различных базовых типов (для обычных типизированных файлов тип параметров read и write должен совпадать с базовым типом файла). Так, в текстовый файл можно записать6 например, целое или вещественное число. При этом его внутреннее представление будет автоматически преобразовано в строчку символов, образующих изображение этого числа.
Для работы с текстовыми файлами, помимо основных процедур и функций, используются и дополнительные.
Процедуры и функции для работы с текстовыми файлами
Eoln ( MyFile ) – функция, для обработки текстовых файлов, позволяющая определить достигнут ли конец строки. Если достигнут – значение функции равно True, а если нет – False. Таким образом, для анализа конкретных символов строк файла можно применить вложенный цикл типа:
while not Eof(NameFale) do
while not Eoln(NameFale) do
A ppend (MyFile : Тext) – процедура открывает существующий файл для присоединения. Если файл уже открыт, то он сначала закрывается, а затем открывается заново. Текущая позиция устанавливается на конец файла. Если в последнем блоке файла размером 128 байтов присутствует символ Сtrl+Z (26 в коде ASCII), то текущая позиция устанавливается в файле таким образом, что при записи первым в блоке будет «затираться» символ Сtrl+Z. После обращения к append файл MyFile становится доступным только по записи и Eof(MyFile) принимает всегда значение True(истина).
Нетипизированные файлы
Нетипизированные файлы – это файлы, поддержка которых осуществляется с максимально возможной скоростью. Введение таких файлов в систему Турбо Паскаль было вызвано стремлением повысить эффективность программ, участвующих в интенсивном обмене с внешними наборами данных.
Эти файлы в отличие от уже рассмотренных не имеют строго определенного типа. Нетипизированный файл рассматривается в Паскале как совокупность символов или байтов. Представление char или byte не играет никакой роли, важен лишь объем занимаемых данных. Такое представление стирает различия между файлами независимо от типа их объявления. На практике это приводит к тому, что любой файл, подготовленный как текстовый или типизированный, можно открыть и начать работу с ним, как с нетипизированным набором данных.
Для определения в программе нетипизированного файла служит зарезервированное слово file:
Внутренняя поддержка таких файлов выглядит наиболее близкой к аппаратной поддержке работы с внешними носителями. За счет этого достигается максимально возможная скорость доступа к наборам данных. Для нетипизированных файлов не нужно терять время на преобразование типов и поиск управляющих последовательностей, достаточно считать содержимое файла в определенную область памяти.
Нетипизированный файл является файлом прямого доступа, что говорит о возможности одновременного использования операций чтения и записи.
Для таких файлов самым важным параметром является длина записи в байтах. Открытие нетипизированного файла с длиной записи в 1 байт можно выполнить следующим образом:
rewrite (MyFile, 1) или reset (MyFile, 1)
Второй параметр, предназначенный только для использования с нетипизированными файлами, задает длину записи файла на сеанс работы.
Особенность аппаратной поддержки заключается в том, что при обращении к внешнему устройству минимально возможным объемом для считывания являются 128 байт. В стремлении добиться наибольшей эффективности файловых операций в Турбо Паскале принято соглашение, по которому длина записи нетипизированного файла по умолчанию составляет 128 байт. Поэтому после открытия файла с помощью вызовов: rewrite(MyFile) или reset(MyFile) все процедуры и функции, обслуживающие файлы прямого доступа, работают с записями длиной 128 байт. Каждый пользователь для своих программ может выбрать наиболее подходящий размер записи.
Турбо Паскаль не накладывает каких-либо ограничений на длину записи нетипизированного файла, за исключением требования положительности и ограничения максимальной длины 65535 байтами (емкость целого типа word). Для того, чтобы гарантированно обеспечить полное чтение всего файла, рекомендуется установить размер записи равным 1.
При работе с нетипизированными файлами могут применяться все процедуры и функции, доступные типизированным файлам. Но так же имеются процедуры, которые доступны только для нетипизированных файлов: BlockRead , BlockWrite .
Процедура BlockRead
blockread(Var F : file; Var Buf; Kolblocks : word; result : word);
Процедура считывает из файла F определенное число блоков в память, начиная с первого байта переменной Buf.
Параметр Buf представляет любую переменную, которая будет участвовать в обмене данными с дисками. Эту переменную нужно описать в программе так, чтобы ее размер не был меньше размера записи, установленного в параметрах rewrite или reset (как правило, для этих целей используется некоторый массив).
Параметр Kolblocks задает число считываемых блоков, которые должны быть прочитаны за одно обращение к диску.
Параметр result является необязательным и содержит после вызова процедуры число действительно считанных записей.
Использование параметра result подсказывает, что число считанных блоков может быть меньше, чем задано параметром Kolblocks. Если result указан при вызове, то ошибки ввода-вывода в такой ситуации не произойдет. Для отслеживания этой и других ошибок чтения можно использовать опции , и функцию IOresult.
Кроме того, что переменная F должна быть описана как нетипизированный файл, она должна быть связана с конкретным физическим диском процедурой assign. Файл должен быть открыт процедурой reset.
Процедура BlockWrite
blockwrite(Var F : file; Var Buf; Kolblocks : word; result : word);
Процедура предназначена для быстрой передачи в файл F определенного числа записей из переменной Buf. Все параметры процедуры blockwrite аналогичны параметрам процедуры blockread. Разница лишь в том, что файл должне быть подготовлен для записи процедурой rewrite. Содержимое переменной Buf целиком помещается в файл, начиная с текущей записи.
Обе процедуры выполняют операции ввода-вывода блоками. Объем блока в байтах определяется по формуле: Объем = Kolblocks * recSize, где recSize – размер записи файла, заданный при его открытии. Суммарный объем разового обмена не должен превышать 64 Кбайт.
Помимо скорости передачи данных преимущество этих процедур заключается в возможности пользователя самостоятельно определять размер буфера для файловых операций. Эта возможность играет значительную роль в тех задачах, где необходимо жесткое планирование ресурсов. Программист должен позаботиться о том, чтобы длина внутреннего представления переменной Buf была достаточной для размещения всех байт при чтении информации с диска.
Дело в том, что чтение информации из файла в буфер, равно как и запись из буфера в файл, производится без типового контроля. Поэтому несоблюдение указанного условия может привести к порче соседних с буфером данных или к помещению на файл посторонней информации.
Если при чтении указана переменная Buf недостаточной длины или если в процессе записи на диск не окажется нужного свободного пространства, то произойдет следующее. Если последний параметр result в этих вызовах не задан, то возникает ошибка ввода-вывода; если параметр result задан, то ошибка не будет зафиксирована, а после выполнения процедуры его значение не будет совпадать с значением параметра Kolblocks. Последнее обстоятельство можно проверить, сравнив два указанных значения. После завершения процедуры указатель смещается на result записей.
сайт обновлён 26.02.2013 вопросы веб-составителю направляйте на
Источник: scmen.ru
3.19. Файлы. Файловые переменные
С термином «файл» вам уже приходилось встречаться. Прежде всего это понятие обычно связывают с информацией на устройствах внешней памяти. В Паскале понятие файла употребляется в двух смыслах:
• как поименованная информация на внешнем устройстве (внешний файл);
• как переменная файлового типа в Паскаль-программе (внутренний файл).
В программе между этими объектами устанавливается связь. Вследствие этого все, что происходит в процессе выполнения программы с внутренним файлом, дублируется во внешнем файле. С элементами файла можно выполнять только две операции: читать из файла и записывать в файл.
Файловый тип переменной — это структурированный тип, представляющий собой совокупность однотипных элементов, количество которых заранее (до исполнения программы) не определено.
Структура описания файловой переменной:
где может быть любым, кроме файлового.
Var Fi: File Of Integer;
Fr: File Of Real;
Fc: File Of Char;
Файл можно представить как последовательную цепочку элементов (эл.), пронумерованных от 0, заканчивающуюся специальным кодом, называемым маркером конца ():
Количество элементов, хранящихся в данный момент в файле, называется его текущей длиной. Существует специальная ячейка памяти, которая хранит адрес элемента файла, предназначенного для текущей обработки (записи или чтения). Этот адрес называется указателем или окном файла.
Для того чтобы начать запись в файл, его следует открыть для записи. Это обеспечивает процедура Rewrite (FV); где FV — имя файловой переменной. При этом указатель устанавливается на начало файла. Если в файле есть информация, то она исчезает. Схематически выполнение процедуры Rewrite можно представить так:
Стрелка внизу отмечает позицию указателя.
Запись в файл осуществляется процедурой Write (FV, V); где V — переменная того же типа, что и файл FV. Запись происходит туда, где установлено окно (указатель). Сначала записывается значение, затем указатель смещается в следующую позицию. Если новый элемент вносится в конец файла, то сдвигается маркер конца. Схема выполнения оператора:
Пример 1. В файловую переменную Fx занести 20 вещественных чисел, последовательно вводимых с клавиатуры.
Var Fx: File Of Real;
For I:=1 To 20 Do
Для чтения элементов файла с его начала следует открыть файл для чтения. Это делает процедура Reset (FV).
В результате указатель устанавливается на начало файла. При этом вся информация в файле сохраняется. Схема выполнения процедуры:
Чтение из файла осуществляется процедурой Read (FV,V); где V — переменная того же типа, что и файл FV. Значение текущего элемента файла записывается в переменную V; указатель смещается к следующему элементу.
Доступ к элементам файла может быть последовательным или прямым. В стандартном Паскале реализован только последовательный доступ.
Принцип последовательного доступа: для того чтобы прочитать п-ю запись файла, сначала нужно прочитать все предыдущие записи с 1-й по (п-1)-ю.
Пример 2. В переменной х получить 10-й элемент вещественного файла Fx.
Var Fx: File Of Real;
For I:=l To 10 Do Read(Fx,X)
Функция Eof (FV) проверяет маркер конца файла (end of file). Это логическая функция, которая получает значение true, если указатель установлен на маркер конца, в противном случае — false.
Пример 3. Просуммировать все числа из файла Fx, описанного в предыдущем примере.
While Not Eof(Fx) Do
To же самое с помощью цикла Repeat можно делать следующим образом:
Во втором варианте возможна ошибка чтения, если файл Fx пустой. Первый вариант от такой ошибки застрахован, поэтому он более предпочтителен.
Внешние файлы. В Турбо Паскале все внешние устройства (дисплей, клавиатура, принтер, диски и т.д.) трактуются как логические устройства с файловой структурой организации данных. Все немагнитные внешние устройства однофайловые. Иначе говоря, с каждым из них связан один файл со стандартным именем, предназначенный для обмена с внутренней памятью ЭВМ текстовой (символьной) информацией.
Стандартные имена логических устройств определяются операционной системой, в среде которой работает Паскаль. В системе MS DOS определены следующие имена:
CON (консоль) — логическое устройство, связанное при вводе с клавиатурой, при выводе — с экраном;
PRN (принтер) — логическое имя файла, связанного с устройством печати;
AUX — логическое имя коммуникационного канала, который используется для связи ПК с другими машинами;
INPUT — логическое имя стандартного устройства ввода, связанного с клавиатурой; при этом вводимые с клавиатуры символы отражаются на экране дисплея;
OUTPUT — логическое имя стандартного устройства вывода на экран.
Магнитный диск (МД) — многофайловое устройство. На нем хранятся как стандартные (системные) файлы, так и файлы, создаваемые пользователем. На магнитном диске могут создаваться файлы любых типов. Файлы на МД используются как в режиме чтения, так и в режиме записи.
Список файлов на диске хранится в директории (каталоге) диска. Каталог вызывается на экран системной командой DIR. В полной форме каталог содержит идентификаторы файлов, объем занимаемой памяти, дату и время создания файла. Идентификатор файла состоит из имени и типа файла:
Имя содержит от 1 до 8 латинских букв и (или) цифр; тип — необязательный элемент (от 0 до 3 символов), указывающий на характер информации, хранимой в файле.
PROGRAM. PAS — в файле текст программы на Паскале;
NUMBER. DAT — файл числовых данных;
NAMES. ТХТ — текстовый файл.
Для организации связи между файловой переменной и внешним файлом в Турбо Паскале используется процедура назначения:
Здесь — строковая величина (константа или переменная). Например:
После выполнения процедур Assign и Rewrite создается новый внешний файл, имя которого заносится в директорию.
Если файл открывается для чтения (Assign и Reset), то в указанном каталоге уже должен содержаться указанный внешний файл. В противном случае будет обнаружена ошибка.
Работа с файлом в программе завершается его закрытием с помощью процедуры
Подведем итог. Для создания и заполнения файла требуется следующая последовательность действий:
1. Описать файловую переменную.
2. Описать переменную того же типа, что и файл.
3. Произвести назначение (Assign).
4. Открыть файл для записи (Rewrite).
5. Записать в файл данные (Write).
6. Закрыть файл (Close).
Пример 4. Создать файл, содержащий среднесуточные температуры за некоторое количество дней. При этом необязательно предварительно указывать количество чисел во вводимой информации
Можно договориться о каком-то условном значении, которое будет признаком конца ввода. Пусть, например, признаком конца ввода будет число 9999.
Var Ft: File Of Real; T: Real;
WriteLn(‘Вводите данные. Признак конца — 9999’);
Write(Ft,T); Write (‘?’); ReadLn(T)
WriteLn (‘Ввод данных закончен»);
В результате работы этой программы на диске будет создан файл с именем Temp. dat, в котором сохранится введенная информация.
Для последовательного чтения данных из файла требуется выполнить следующие действия:
1. Описать файловую переменную.
2. Описать переменную того же типа.
3. Выполнить назначение (Assign).
4. Открыть файл для чтения (Reset).
5. В цикле читать из файла (Read).
6. Закрыть файл (Close).
Пример 5. Определить среднюю температуру для значений, хранящихся в файле Temp.dat.
Var Ft: File Of Real;
T,St: Real; N: Integer;
While Not Eof(Ft) Do
WriteLn(‘Средняя температура зa’,N:3,’суток равна’,St:7:2,’гр-в’);
В этой программе использована функция определения размера файла:
Ее результат — целое число, равное текущей длине файла.
Замечание: согласно стандарту Паскаля в файл, открытый оператором Rewrite, можно только записывать информацию, а файл, открытый оператором Reset, можно использовать только для чтения. В Турбо Паскале допускается запись (Write) в файл, открытый для чтения (Reset). Это создает определенные удобства для модификации файлов.
Текстовые файлы. Текстовый файл — наиболее часто употребляемая разновидность файлов. Как уже отмечалось раньше, немагнитные внешние устройства (логические) работают только с текстовыми файлами. Файлы, содержащие тексты программ на Паскале и других языках программирования, являются текстовыми. Различная документация, информация, передаваемая по каналам электронной связи, — все это текстовые файлы.
В программе файловая переменная текстового типа описывается следующим образом:
Текстовый файл представляет собой символьную последовательность, разделенную на строки
Каждая строка заканчивается специальным кодом — маркером конца строки (м.к.с.). Весь файл заканчивается маркером конца файла (м.к.ф.). Схематически это выглядит так:
Каждый символ представлен во внутреннем коде (ASCII) и занимает 1 байт. Текстовый файл отличается от символьного не только делением на строки. В текстовой файл можно записать и из него прочитать информацию любого типа. Если эта информация несимвольная, то в процессе чтения или записи происходит ее преобразование из символьной формы во внутреннюю и обратно.
Текстовый файл можно создать или преобразовать с помощью текстового редактора. Его можно просмотреть на экране дисплея или распечатать на принтере.
В программах на Паскале для работы с текстовыми файлами наряду с процедурами Read и Write употребляются процедуры ReadLn и WriteLn.
Эта процедура читает строку из файла с именем FV, помещая прочитанное в переменные из списка ввода.
Процедура записывает в файл FV значения из списка вывода, после чего выставляет маркер конца строки.
Для обнаружения конца строки в текстовом файле используется функция
(End of line — конец строки). Это логическая функция, которая принимает значение true, если указатель файла достиг маркера конца строки и false — в противном случае.
Употребление операторов Read и ReadLn без указания имени файловой переменной обозначает чтение из стандартного файла Input (ввод с клавиатуры). Употребление операторов Write и WriteLn без имени файловой переменной обозначает запись в стандартный файл Output (вывод на экран). В таком варианте этими операторами мы уже многократно пользовались. Считается, что файлы INPUT и OUTPUT всегда открываются соответственно для чтения и записи при работе любой программы.
При вводе с клавиатуры маркер конца строки обнаруживается при нажатии на клавишу Enter.
Процедура ReadLn может использоваться без списка ввода. В этом случае происходит пропуск текущей строки в читаемом файле.
Употребление процедуры WriteLn без списка вывода обозначает вывод пустой строки (в файле выставляется маркер конца строки).
При записи в текстовый файл в списке вывода могут присутствовать форматы. Действия форматов мы уже рассматривали при обсуждении вывода данных на экран. Точно так же форматы работают и при выводе в текстовые файлы, связанные с любыми другими устройствами.
Пример 6. Пусть файл с именем Note.txt содержит некоторый текст. Требуется подсчитать количество строк в этом тексте.
Var Note: Text; К: Integer;
Begin Assign (Note,’Note.txt’);
While Not Eof(Note) Do
WriteLn (‘Количество строк равно’,К);
Используемый здесь оператор ReadLn (Note) «пролистывает» строки из текстового файла Note, не занося их в какую-либо переменную.
Пример 7. В текстовом файле Note.txt определить длину самой большой строки.
Max,К: Integer; С: Char;
While Not Eof(Note) Do
While Not Eoln(Note) Do
If K>Max Then Max:=K;
WriteLn(‘Наибольшая строка имеет’, Max,’знаков’);
Здесь каждая строчка прочитывается посимвольно, при этом в переменной к работает счетчик числа символов в строке. В переменной Мах отбирается наибольшее значение счетчика.
Источник: studfile.net
Решение задач. Процедуры и функции работы с файлами.
первый аргумент которой — переменная файлового типа, а второй аргумент — строкового типа — новое имя файла, которое может быть сокращенным или полным (с указанием пути). Действие этой процедуры эквивалентно действию аналогичной процедуры DOS.
Уничтожение части файла от текущего положения до конца производится процедурой
Уничтожение всего файла производится процедурой
действие которой эквивалентно удалению файла в операционной системе DOS.
Примечание. Физические файлы на магнитных дисках и переменные файлового типа в программе на Паскале — объекты различные. Переменные файлового типа в Паскале соответствуют не только физическим файлам, но и логическим устройствам, связанным с вводом и выводом информации. Клавиатуре и экрану дисплея соответствуют файлы со стандартными именами Input и Output.
Задание. Рассмотрите предложенный ниже текст программы. Сформулируйте решенную задачу. Создайте расширенный вариант подобной задачи. результат покажите учителю для оценки.
Program Files;
Uses
Crt;
Var
F,Fnew: file of string;
Name,NewName: string[12];
Text: string;
Ch: char;
Procedure ReadText;
Begin
repeat
write(‘Введите имя файла>’);
readln(Name);
assign(F,Name);
reset(F);
if IOresult<>0
then
begin
writeln(‘Ошибка чтения’);
close(F);
end;
until IOresult=0;
writeln(‘Содержание файла ‘,Name,’:’);
while not Eof(F) do
begin
readln(F,Tеxt);
writeln(Tеxt);
end;
close(F);
End;
Procedure EraseFile;
Begin
erase(F);
writeln(‘Файл удален’);
End;
Procedure ReNameFile;
Begin
write(‘Введите новое имя файла:’);
readln(NewName);
rename(F,NewName);
writeln(‘Файл ‘,Name,’ переименован в файл ‘,NewName);
End;
Procedure CopyFile;
Begin
write(‘Введите имя копии файла ‘,Name,’>’);
readln(NewName);
reset(F);
assign(Fnew,NewName);
rewrite(Fnew);
while not Eof(f) do
begin
readln(F,Text);
writeln(Fnew,Text);
end;
close(F);
close(F_new);
writeln(‘Файл’,Name,’ скопирован в файл ‘,NewName);
End;
Begin
ClrScr;
readTеxt;
repeat
writeln(‘Удаление файла (D),переименование файла(R)’);
writeln(‘Копирование файла (C), выход из программы (Е)’);
write(‘Введите символ нужной операции — ‘);
readln(ch);
case ch of
‘D’,’d’: EraseFile;
‘R’,’r’: ReNameFile;
‘C’,’c’: CopyFile;
end;
until (ch=’E’) or (ch=’e’);
read;
End.
Выберите с учителем одну из предложенных ниже задач.
Приготовьте листинги решенных и проверенных учителем задач. Проверьте свои знания, ответив на ниже следующие вопросы.
Контрольные вопросы
- Что называется файлом? как его описать в программе?
- Какие действия можно производить с файлами?
- Как записать файл? Какие процедуры или функции надо применить? Как производится запись?
- Как прочитать файл? Какие процедуры или функции используются? Как происходит чтение данных из файла?
- Как закончить работу с файлом?
- Как обратиться к компоненте с заданным номером?
- Как подсчитать, сколько элементов в данном файле?
- Верно ли, что элементы файла должны быть одного типа и что файл отличается от массива только тем, что размер (количество элементов) файла произволен, а размер массива фиксирован?
- Можно ли, считав из файла пятый элемент, затем сразу же считать второй? Если нет, то какой можно?
- Верно ли, считав из файла пятый элемент, затем уже никогда нельзя считать его второй элемент?
- В какое место файла можно добавлять новые элементы: в начало, в середину, в конец, куда угодно, никуда?
- Если не переписывать файл заново, то значения каких его элементов можно менять: только первого, только последнего, каких угодно, никаких? А какие элементы можно удалять?
- Верно ли, что в одно и то же время нельзя считывать из файла и записывать в него? верно ли, что, начав считывать из файла, затем уже никогда нельзя записывать в него? А наоборот?
- Можно ли сравнивать файлы или присваивать один файл другому?
Примеры решения задач.
- Создать файл,содержащий информацию о работниках:табельный номер,фамилия,оклад. Создать другой файл,в котором содержится информация о работнике,имеющем максимальный оклад.
- Создать файл,содержащий информацию о работниках института.Найти средний стаж работы в институте.
- Создать файл телефонного справочника. По желанию пользователя можно создать,просмотреть, дополнить файл справочника,найти номер телефона по фамилии абонента,удалить компоненты файла-справочника.
Текстовые файлы
Особое место в языке Паскаль занимают текстовые файлы, компоненты которых имеют символьный тип. Для описания текстовых файлов в языке определен стандартный тип Тext:
var TF1, TF2: Text;
Текстовые файлы представляют собой последовательность строк, а строки – последовательность символов. Строки имеют переменную длину, каждая строка завершается признаком конца строки.
С признаком конца строки связана функция EOLn(var T:Text):Boolean, где Т – имя текстового файла. Эта функция принимает значение TRUE, если достигнут конец строки, и значение FALSE, если конец строки не достигнут.
Для операций над текстовыми файлами, кроме перечисленных, определены также операторы обращения к процедурам:
ReadLn (T) – пропускает строку до начала следующей;
WriteLn (T) – завершает строку файла, в которую производится запись, признаком конца строки и переходит к началу следующей.
Для работы с текстовыми файлами введена расширенная форма операторов ввода и вывода. Оператор
эквивалентен группе операторов
Здесь Т – текстовый файл, а переменные Х1, Х2. ХК могут быть либо переменными целого, действительного или символьного типа, либо строкой. При чтении значений переменных из файла они преобразуются из текстового представления в машинное.
эквивалентен группе операторов
begin
Write(T,X1);
Write(T,X2);
Write(T,XK)
end;
Здесь Т – также текстовый файл, но переменные Х1, Х2. ХК могут быть целого, действительного, символьного, логического типа или строкой. При записи значений переменных в файл они преобразуются из внутреннего представления в текстовый.
К текстовым файлам относятся стандартные файлы INPUT, OUTPUT.
Рассмотренные ранее операторы ввода – вывода являются частным случаем операторов обмена с текстовыми файлами, когда используются стандартные файлы ввода-вывода INPUT, OUTPUT.
Работа с этими файлами имеет особенности:
– имена этих файлов в списках ввода-вывода не указываются;
– применение процедур Reset, Rewrite и Close к стандартным файлам ввода-вывода запрещено;
– для работы с файлами INPUT, OUTPUT введена разновидность функции EOLn без параметров.
– Турбо Паскаль вводит дополнительные процедуры и функции, применимые только к текстовым файлам, это SetTextBuf, Append, Flush, SeekEOLn, SeekEOF.
Процедура SetTextBuf (var f: Text; var Buf; BufSize: Word) служит для увеличения или уменьшения буфера ввода-вывода текстового файла f. Значение размера буфера для текстовых файлов по умолчанию равно 128 байтам. Увеличение размера буфера сокращает количество обращений к диску. Рекомендуется изменять размер буфера до открытия файла. Буфер файла начнется с первого байта переменной Buf. Размер буфера задается в необязательном параметре BufSize, а если этот параметр отсутствует, размер буфера определяется длиной переменной Buf.
Процедура Append (var f: Text) служит для специального открытия выходных файлов. Она применима к уже существующим физическим файлам и открывает их для дозаписи в конец файла.
Процедура Flush (var f: Text) применяется к открытым выходным файлам. Она принудительно записывает данные из буфера в файл независимо от степени его заполнения.
Функция SeekEOLn (var f: Text): Boolean возвращает значение True, если до конца строки остались только пробелы.
Компонентные файлы
Компонентный или типизированный файл – это файл с объявленным типом его компонент. Компонентные файлы состоят из машинных представлений значений переменных, они хранят данные в том же виде, что и память ЭВМ.
Описание величин файлового типа имеет вид:
type M= File Of T;
где М – имя файлового типа; Т – тип компоненты. Например:
type
FIO= String[20];
SPISOK=File of FIO;
var
STUD, PREP: SPISOK;
Здесь STUD, PREP – имена файлов, компонентами которых являются строки.
Описание файлов можно задавать в разделе описания переменных:
var
fsimv: File of Char;
fr: File of Real;
Компонентами файла могут быть все скалярные типы, а из структурированных – массивы, множества, записи. Практически во всех конкретных реализациях языка Паскаль конструкция «файл файлов» недопустима.
Все операции над компонентными файлами производятся с помощью стандартных процедур:
Reset, Rewrite, Read, Write, Close.
Для ввода-вывода используются процедуры:
где f – имя логического файла; Х – либо переменная, либо массив, либо строка, либо множество, либо запись с таким же описанием, какое имеет компонента файла.
Выполнение процедуры Read (f,X) состоит в чтении с внешнего устройства одной компоненты файла и запись ее в X. Повторное применение процедуры Read (f,X) обеспечит чтение следующей компоненты файла и запись ее в X.
Выполнение процедуры Write (f,X) состоит в записи X на внешнее устройство как одной компоненты. Повторное применение этой процедуры обеспечит запись X как следующей компоненты файла.
Для работы с компонентными файлами введена расширенная форма операторов ввода и вывода:
Read(f,X1,X2. XK)
Write(f,X1,X2. XK)
Здесь f – компонентный файл, а переменные Х1, Х2. ХК должны иметь тот же тип, что и объявленный тип компонент файла f.
Бестиповые файлы
Бестиповые файлы позволяют записывать на диск произвольные участки памяти ЭВМ и считывать их с диска в память. Операции обмена с бестиповыми файлами осуществляются с помощью процедур BlokRead и BlockWrite. Кроме того, вводится расширенная форма процедур Reset и Rewrite. В остальном принципы работы остаются такими же, как и с компонентными файлами.
Перед использованием логический файл
должен быть связан с физическим с помощью процедуры Assign. Далее файл должен быть открыт для чтения или для записи процедурой Reset или Rewrite, а после окончания работы закрыт процедурой Close.
При открытии файла длина буфера устанавливается по умолчанию в 128 байт. Турбо Паскаль позволяет изменить размер буфера ввода-вывода, для чего следует открывать файл расширенной записью процедур
Reset(var f: File; BufSize: Word);
Rewrite(var f: File; BufSize: Word);
Параметр BufSize задает число байтов, считываемых из файла или записываемых в него за одно обращение. Минимальное значение BufSize – 1 байт, максимальное – 64 Кбайта.
Чтение данных из бестипового файла осуществляется процедурой
BlockRead(var f: File; var X; Count: Word;
var QuantBlock: Word);
Эта процедура осуществляет за одно обращение чтение в переменную X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера. Значение Count не может быть меньше 1. За одно обращение нельзя прочесть больше, чем 64 Кбайтов.
Необязательный параметр QuantBlock возвращает число блоков (буферов), прочитанных текущей операцией BlockRead. В случае успешного завершения операции чтения QuantBlock = Count, в случае аварийной ситуации параметр QuantBlock будет содержать число удачно прочитанных блоков. Отсюда следует, что с помощью параметра QuantBlock можно контролировать правильность выполнения операции чтения.
Запись данных в бестиповой файл выполняется процедурой
BlockWrite(var f: File; var X; Count: Word;
var QuantBlock: Word);
которая осуществляет за одно обращение запись из переменной X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера.
Необязательный параметр QuantBlock возвращает число блоков (буферов), записанных успешно текущей операцией BlockWrite.
Источник: megalektsii.ru