7.5.2. Операторы для работы с файлами в Pascal
В независимости от используемого языка программирования (Pascal,C++,Javaи т.д.), операционной системы (Windows,Linux,Unix,Mac-OSи т.д.), аппаратной архитектуры (персональный компьютер, сотовый телефон, промышленный контроллер и т.д.), рано или поздно перед программистом возникнет задача длительного хранения данных, необходимых для работы программы. В качестве энергонезависимого носителя, на который может быть сохранена информация для длительного хранения, могут выступать: дискета, кассетная лента,flash,fram, жесткий диск (магнитный или полупроводниковый) и т.д. В зависимости от используемой операционной системы, различаются способы организации информации на тех или иных носителях. Крайний и наиболее сложный случай заключается в том, что программист должен полностью продумывать механизмы хранения информации, вплоть до оперирования с памятью на уровне отдельных ячеек или кластеров. При использовании современных операционных систем (Windows,Linuxи т.д.) вся сложность работы с тем или иным устройством прячется от программиста. В замен ему предлагается работать с более понятным и универсальным объектом – «файл». Файл – это именованный участок данных, сохраненных в энергонезависимой памяти (например, на флешке). Совершенно не важно, как физически хранятся данные (везде – по-разному). Программиста это вопрос не должен интересовать. Операционная система предоставляет программисту готовые функции для работы с файлами, осуществляющие: создание, открытие, закрытие файла, запись в файл, чтение из файла и ряд других функций.
После изучения (в достаточной мере) принципов работы с файлами, реализация (в будущей работе) иных способов хранения информации не должна представлять чрезмерных трудностей.
Хотя информация в файле всегда хранится в виде некоторого набора байтов, принято различать текстовые файлы (их можно открыть в простейшем текстовом редакторе, например «Блокнот», и внести необходимые изменения) и двоичные файлы (попытка открытия таких файлов в блокноте ничего полезного не даст). Как бы то ни было, перед началом работы с файлом необходимо объявить и инициализировать некоторую переменную (в терминологии языка Pascal– файловую переменную), после чего ее необходимо указывать в каждом операторе, выполняющем ту или иную работу с файлом.
Наиболее простой и понятной является работа с текстовыми файлами, поскольку пользователь в любой момент может открыть созданный файл из программы «Блокнот» и, при необходимости, внести в него свои изменения. В приведенном ниже примере программа в цикле требует от пользователя ввести строку, пока он не введет символ «*». Все вводимые строки будут сохраняться в указанный текстовый файл.
S: string[100];
После окончания работы с программой предлагается открыть полученный файл с помощью блокнота и убедиться в наличии всех введенных строк.
При работе с файлом необходимо в первую очередь инициализировать файловую переменную (в данном случае F:Text). Файловая переменная внутренне объявлена какRECORDс многочисленными полями, в том числе «имя файла» и «файловый указатель». Таким образом, данная структура является самодостаточной, что избавляет от необходимости многократного указания имени файла. Далее файл необходимо открыть. Существует несколько процедур открытия файлов (это связано с существованием большого количества режимов открытия), в результате успешной работы которых происходит открытие файла, после чего можно с ним работать, т.е. выполнять операции ввода/вывода. После завершения всех операций ввода/вывода файл необходимо закрыть. Если этого не сделать, то дальнейшие попытки открыть файл (например, в другой процедуре) могут окончиться неудачно.
Помимо текстовых файлов, язык Pascalсущественно упрощает работу также и с двоичными файлами. Двоичный файл в общем случае нельзя открыть с помощью блокнота, однако, это более предпочтительный, универсальный и экономичный формат для хранения разного рода информации. Проще всего работать с «типизированными» двоичными файлами, поскольку в этом случае работа с файлом напоминает работу с одномерным массивом. Например, так выглядит код сохранения элементов массива в типизированный файл:
F: fileofTBirthDay;
for I := 1 to ACount do
Кроме того, Pascalпозволяет работать с файлами, которые невозможно отнести ни к одному известному типу. В терминологии языкаPascalтакие файлы являются «нетипизированными» (фактически – это массив байтов). На самом деле это наиболее привычный для большинства программистов способ представления, поскольку в таких файлах можно хранить совершенно любую информацию, как текстовую, так и двоичную. Разумеется, организация работы с нетипизированными файлами является несколько более сложной. Для ввода/вывода вместо процедурReadиWriteиспользуются процедурыBlockReadиBlockWrite. Более подробную информацию по работе с нетипизированными файлами в языкеPascalчитатель может с легкостью получить в других источниках.
Процедуры по обработке текстовых и типизированных файлов, требуемые для выполнения данной лабораторной работы, приведены в таблице 7.1.
Таблица 7.1 – Процедуры для работы с файлами
Связывает имя файла с файловой переменной
Открывает текстовый файл для добавления новых записей в конец файла. Если файл не найден, то возникнет ошибка
Открывает текстовый файл для чтения, или двоичный файл для чтения/записи. Если файл не найден, то возникнет ошибка
Открывает текстовый или двоичный файл для записи. Файл будет создан и обнулен автоматически
Запись в файл Python. Перезапись файла Python
Высокоуровневый язык Python 3 имеет множество полезных средств, позволяющих взаимодействовать с текстовыми файлами. Вы можете как создавать документы для хранения информации, так и выполнять чтение, запись и удаление данных. Сегодня поговорим о создании и записи файлов.
Создание файла, его открытие и закрытие
Работа с текстовым файлом в Python начинается с момента вызова функции open. Она принимает в качестве атрибутов путь к объекту на ПК и режим обработки. Вы можете указать абсолютный путь (это адрес размещения на жёстком диске) или относительный (речь идёт о координатах относительно папки проекта).
Что касается режима обработки файла, то при его выборе учитывайте его назначение («r» — для чтения, «w» — для записи). Таблица ниже позволит вам ознакомиться с режимами доступа к файлу в Python:
А вот пример простейшего взаимодействия с текстовым документом:
Здесь функция open принимает относительный путь, открывая его для записи. При этом, если в папке файл otus.txt будет отсутствовать, метод open создает его автоматически, после чего откроет для него нужный режим обработки.
Метод close закрывает файл, а это необходимо сделать, выполнив нужные вам действия с переменной file (иначе потеряете информацию). Впрочем, можно обойтись и без close, используя связку операторов with as (переменная, которая ссылается на файл, должна быть прописана после конструкции):
Метод write() для записи в файл в Python
В предыдущих примерах мы уже использовали метод write() . Он позволяет записывать любую строку в открытый файл. Помните, что строки в Python способны содержать не только текст, но и двоичные данные.
Запись в файл построчно выполняется посредством записи нужной вам строки с последующей записью \n — символа перевода строки.
Давайте ещё раз посмотрим на запись в файл с помощью метода write(). Синтаксис:
Код, представленный выше, создаст файл otus.txt , записав в него указанную строку.
Давайте теперь выполним запись списка поэлементно, где каждый элемент списка будет записан в новой строке:
Работа с файлами в Паскале: общие сведения
В языке Pascal выделяются файловые данные, которые используются для работы с информацией, находящейся на внешних устройствах. Данная информация заложена в памяти компьютера, формируя определенную область, которую называют «файл».
Файл – совокупности однотипных элементов. Он имеет название (имя). Чаще всего файлы используются при необходимости долгосрочного хранения, большого объема данных или с целью предоставления доступа нескольким устройством к единому контенту.
Файлы классифицируют на логические и физические. Последние располагаются на съемном носителе и им задается имя. Логические представлены в программе.
Язык Pascal содержит 3 вида файлов:
- Текстовые (text).
- Типизированные файлы (fileof<тип>);
- Бестиповые или нетипизированные (file).
Описание файловых переменных. Пример:
Стандартные процедуры и функции
Программе становятся доступны все дисковые файлы, после того как они будут связаны с их файловой переменной, объявленной в программе. Любые операции в программе осуществляются только с помощью файловой переменной, связанной с физическим файлом.
Assign(f, FileName)
Отвечает за связку файловой переменной f с файлом, имя которого указано в строке FileName. Эта связь будет непрерывной до завершения работы программы или до того времени, пока не произойдет переназначение.
Когда произойдет связка файловой переменной с именем файла в программе необходимо указать направление передачи данных. В зависимости от данного направления говорят о записи в файл или чтении из файла.
Reset(f)
Открывает файл для чтения, с которым в связке файловая переменная f. После выполнения процедуры Reset файл будет готов к чтению из него первого элемента. Если указанный файл не будет найден, процедура Reset будет завершена с сообщением об ошибке.
В том случае, если f представляет собой типизированный файл, то он одновременно открывается для чтения и записи.
Rewrite(f)
Процедура открывает файл для записи, с которым в связке файловая переменная f. После выполнения процедуры Rewrite файл готов к записи. Если такой файл уже существовал, то данные будут перезаписаны.
Close(f)
Процедура закрывает открытый ранее файл с файловой переменной f. Процедура требуется при завершении работы с файлом. Если она не будет выполнена, то файл все равно будет создан на внешнем устройстве, но в него не будет перенесено содержимое последнего буфера.
EOF(f): boolean
Процедура возвращает значение TRUE, когда во время чтения будет достигнут конец файла. Это значит, что в файле был прочитан последний элемент или он оказался пустым.
Rename(f, NewName)
Процедура позволяет переименовать файл на диске, который связан с файловой переменной f. Задать новое имя можно только после его закрытия.
Erase(f)
Процедура уничтожает физический файл, который связан с файловой переменной f. К моменту вызова процедуры файл должен быть закрыт.
IOResult
Процедура возвращает целое число, которое соответствует коду последний ошибки ввода-вывода. Если операция будет завершена нормально, функция IOResult вернет значение 0. Значение функции нужно присваивать какой-либо переменной, поскольку при каждом вызове функция будет обнулять свое значение. IOResult работает с ключом компиляции <$I->или когда выключен режим проверок ошибок ввода.
Работа с текстовыми файлами
Что такое текстовый файл? По сути, это совокупность строй, которые разделены метками конца строки. Файл завершается меткой конца файла. К каждой строке предоставляется доступ только последовательно, начиная с первой. Чтение и запись одновременно – запрещены.
Чтение текстового файла:
Read(f, список переменных);
ReadLn(f, список переменных);
Процедуры считывают информацию из файла f в переменные. От типа переменных в списке зависит способ чтения. Символы из файла помещаются в переменную char. В числовую переменную пропускаются начальные пробелы, символы-разделители и считывается значение числа до следующего разделителя.
Количество символов, соответствующее длине строки, помещается в переменную типа string (и то только в том случае, если ранее не встретились символы конца файла или конца строки).
Чем отличаются Read от ReadLn? В первой процедуре после прочтения данных пропускаются все остальные символы в данной строке, в том числе и метка конца строки. Если списка переменных нет, ReadLn(f) пропускаетстрокупричтениитекстовогофайла.
Запись в текстовый файл:
Write(f, список переменных);
WriteLn(f, список переменных);
Данные процедуры записывают информацию в файл. Способ записи напрямую зависит от типа переменных в списке. Учитывается формат вывода.
Процедура WriteLn в отличие от Write после записи всех значений из переменных записывает ищи метку конца строки (создается законченная строка файла).
Добавление информации к концу файла:
Данная процедура открывает текстовый файл чтобы добавить информацию к его концу. Эту процедуру применяют вместо Rewrite.
Работа с типизированными файлами
Что такое типизированный файл? Это последовательность компонент любого заданного типа (за исключением типа «файл»). К компонентам файла осуществляется доступ по их порядковым номерам. Нумерация начинается с 0. Номер текущей компоненты (указатель) после открытия файла стоит в его начале на нулевом компоненте. После каждой записи или чтения указатель будет сдвигаться к следующему компоненту.
Запись в файл:
Write(f, список переменных);
Эта процедура записывает информацию из списка переменных в файл f.
Write(<имя_ф_переменной>, <список записи>);
Чтение из файла:
Процедура читает компоненты из файла f в указанные переменные. Тип переменных и файловых компонент должны совпадать. При попытки чтения несуществующих компонент, произойдет ошибочное завершение программы. Нужно точно рассчитать количество компонент или делать проверку их существования перед каждым чтением.
Смещение указателя файла:
Смещает указатель файла f на заданную позицию (n). Нумерация в файле считается с нуля.
Определение количества компонент:
Процедура возвращает количество компонента в файле f.
Определение позиции указателя:
Возвращает порядковый номер текущего компонента файла f.
Отсечение последних компонент файла:
Функция отсекает конец файла (с текущей позиции включительно).
Работа с нетипизированными файлами
Нетипизированные файлы представляют собой последовательность компонент произвольного типа.
Открытие нетипизированного файла:
BufSize задает число байтов, которые записываются в файл или считываются из него за одно обращение. Максимальное значение BufSize – 64 Кбайт, минимальное – 1 байт. Если значение не указано, то по умолчанию используется 128.
Чтение данных из нетипизированного файла:
Процедура осуществляет чтения в переменную Х количества блоков (за одно обращение), заданное параметром Count. Длина блока соответствует длине буфера. Значение Count не бывает меньше 1. Максимальный объем чтения – 64 Кбайт за одно обращение.
QuantBlock – необязательный параметр. Он возвращает число блоков, прочитанных текущей операцией BlockRead. При успешном завершении операции чтения QuantBlock равно Count. При аварийной ситуации QuantBlock будет содержать число блоков, которые были удачно прочитаны. Таким образом, параметр QuantBlock позволяет осуществлять контроль за правильностью выполнения операции чтения.
Запись данных в нетипизированный файл:
За одно обращение процедура осуществляет запись из переменной Х количества блоков, которые были заданы параметром Count. Длина блока = длине буфера. QuantBlock возвращает число блоков, которые были успешно записаны текущей операцией BlockWrite.
Внимание! Для нетипизированных файлов можно применять процедуры FIlePos, FileSize и Seek, точно также, как и в случае с процедурами типизированных файлов.
Пример решения задачи с файлами Pascal
Условия задачи: нужно сформировать текстовый файл на языке Pascal, после через переписать из него во второй файл стройки, которые начинаются с большой или маленькой буквы «А» («а»).
В таком случае, потребуется две файловые переменные f1 и f2. Так как файлы текстовые тип переменных – text. Решение задачи состоит из двух частей:
- Создание первого файла.
- Чтение первого файла и создание второго.
Также есть смысл задать еще одну часть, которая не была указана в задачи, — вывод содержимого второго файла на экран.
Что будет записано в файл f при выполнении оператора writeln f
Аргументами (Arguments) могут быть переменные разных типов. Если используется несколько переменных, то они перечисляются через запятую. Например:
Причём, как уже было сказано, при выводе на консоль эти переменные могут быть разных типов. Также можно использовать и константы:
Если требуется перевод строки, то лучше использовать функцию WriteLn вместо Write:
Но можно использовать, например, символы перевода строки в конце списка аргументов:
При записи в файл можно работать как с типизированными файлами, так и с текстовыми файлами.
Если файл F имеет тип Text, то все необходимые преобразования будут выполнены таким образом, что выходная переменная будет в удобочитаемом формате. Это преобразование выполняется для всех числовых типов. Строки и типы PChar выводятся точно так, как они находятся в памяти.
При выводе на консоль целые числовые значения выводятся в обычном числовом формате. А вещественные числовые значения по умолчанию выводятся в научной нотации.
Чтобы выводить целые числа в поля фиксированной ширины или вещественные числа с фиксированным количеством знаков после запятой, используется специальный формат вывода. Но об этом в данной статье я говорить не буду, так как уже рассказывал об этом здесь.
Организация ввода и вывода данных с использованием файлов

Список вопросов теста
Вопрос 1
Сколько байтов памяти занимает признак конца строки в текстовом файле?
Вопрос 2
Без пробелов запишите условие описанного цикла для считывания массива чисел из файла?
Вопрос 3
В каком виде хранятся данные на устройствах внешней памяти?
Варианты ответов
Вопрос 4
Какое количество памяти занимает один символ в текстовом файле?
Варианты ответов
Вопрос 5
Укажите верный порядок следования операторов в программе?
Укажите порядок следования всех 4 вариантов ответа:
Варианты ответов
Вопрос 6
Что будет записано в файл f при выполнении оператора writeln ( f )?
Выберите один из 4 вариантов ответа:
Варианты ответов
Вопрос 7
Укажите соответствие между операторами и их описаниями.
Укажите соответствие для всех 4 вариантов ответа:
1) Назначает файловой переменной файл с указанным названием
3) Считывает данные из текстового файла, соответствующего переменной f
4) Открывает текстовый файл для чтения
Варианты ответов
Вопрос 8
При помощи какого оператора текстовый файл открывается для перезаписи?
Выберите один из 4 вариантов ответа:
Варианты ответов
Вопрос 9
Какие разновидности файлов существуют?
Выберите несколько из 4 вариантов ответа:
Варианты ответов
Вопрос 10
Какой тип в языке Pascal имеет файловая переменная, для обращения к текстовому файлу?
Выберите один из 4 вариантов ответа:
Процедура записи в текстовый файл WRITELN
Эта процедура заносит в буфер файла признак конец строки и записывает (выталкивает) содержимое буфера в текстовый файл, начиная с позиции признака конец файла. После последнего записанного в файл символа (это признак конец строки) записывается признак конец файла, буфер освобождается и связывается с этим признаком.
Стандартное обращение к процедуре имеет вид:
Пример записи в текстовый файл
В результате работы программы будет создан файл c:\tp\user\dandatt.pas. Содержимое этого файла приведено на рис. 24.4 (компоненты на рисунке располагаются слева направо, сверху вниз).
| ‘П’ | ‘р’ | ‘и’ | ‘м’ | ‘е’ | ‘р’ | ‘ ‘ | ‘ ‘ | ‘ ‘ | ‘ ‘ | ‘в’ | ‘ы’ | ‘в’ | ‘о’ | ‘д’ | ‘а’ | ‘ ‘ | ‘ ‘ | ‘T’ | ‘R’ | ‘U’ | ‘E’ |
| ‘F’ | ‘A’ | ‘L’ | ‘S’ | ‘E’ | KC | ‘ ‘ | ‘ ‘ | ‘-‘ | ‘5’ | ‘-‘ | ‘2’ | ‘5’ | ‘2’ | ‘3’ | ‘2’ | ‘7’ | ‘6’ | ‘7’ | ‘-‘ |
| ‘3’ | ‘.’ | ‘5’ | ‘6’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘E’ | ‘+’ | ‘0’ | ‘0’ | KC | ‘ ‘ | ‘5’ | ‘.’ | ‘7’ | ‘E’ |
| ‘+’ | ‘0’ | ‘2’ | KC | ‘5’ | ‘6’ | ‘7’ | ‘.’ | ‘4’ | ‘2’ | ‘0’ | ‘0’ | KФ |
Рис. 24.4. –Содержимое файла
Процедура чтения из текстового файла READ
Чтение из текстового файла осуществляется с помощью обращения к стандартной процедуре
, где объект ввода это имя простой переменной:
— любого из числовых типов;
— символьного типа char;
— любого из строковых типов string
или имя простого компонента переменной структурированного типа.
Правила выполнения процедуры read
Синтаксическое ограничение при вызове процедуры: второй параметр обязательно любого целого, любого вещественного, литерного char или любого строкового типа. Правила выполнения зависят от типа второго параметра.
Вариант 1: второй параметр числового типа
(любого целого, либо любого вещественного)
1) В буфер файла считываются позиции текстового файла, начиная с позиции, с которой был связан буфер до обращения к процедуре read до первой позиции, в которой располагается либо пробел, либо символ табуляции, либо признак конец строки, либо признак конец файла. При этом начальные позиции с пробелами, символами табуляции и признаками конец строки игнорируются.
2) Прочитанные в буфер символы преобразуются в значение типа данных второго параметра. Если из файла не прочитано ни одного символа (буфер связан с признаком конец файла), то считается, что прочитан 0.
3) Если при преобразовании встретился символ, который не может быть преобразован в численное значение, то возникает ошибка ввода-вывода.
4) Если в результате преобразования получено число, не принадлежащее множеству значений типа второго параметра, то возникает ошибка выхода из диапазона значений.
5) При успешном преобразовании полученное значение заносится в оперативную память под именем второго параметра. Буфер файла освобождается. Новое положение буфера связано с позицией файла, в которой прекращено чтение (это либо пробел, либо признак конец строки, либо признак конец файла).
Вариант 2: второй параметр литерного типа char
1) В буфер считывается одна позиция текстового файла. Если это не признак конец файла, то буфер связывается со следующей позицией текстового файла. Если до выполнения процедуры read был связан с признаком конец файла, то местоположение буфера не изменяется.
2) Прочитанный символ заносится в оперативную память под именем второго параметра.
Вариант 3: второй параметр любого строкового типа
1) В буфер файла считывается столько позиций из текстового файла, сколько определено в строковом типе для второго параметра, если ранее не встретился признак конца строки или признак конца файла.
2) Если встретился признак конец строки или конец файла, то буфер связывается с позицией признака. Если при чтении эти признаки не встретились, то новое положение буфера – первая непрочитанная позиция.
3) Информация из буфера заносится в оперативную память под именем второго параметра, при этом формируется динамическая длина прочитанной строки.
Процедура пропуска очередного признака конец строки READLN
После выполнения обращения к процедуре readln( )
буфер связывается со следующей позицией за ближайшим справа признаком конец строки. Если этот признак не встретился, то буфер связывается с признаком конец строки.
Пример чтения из текстового файла
Пусть в текстовом файле c:\tp\user\inp.pas находится информация, приведенная на рис. 24.5.
| ‘F’ | КС | КС | ‘5’ | ‘ ‘ | ‘7’ | ‘.’ | ‘5’ | ‘e’ | ‘-‘ | ‘3’ | КС | ‘П’ | ‘Р’ | ‘И’ | ‘М’ | ‘Е’ | ‘Р’ |
| ‘Ч’ | ‘Т’ | ‘Е’ | ‘Н’ | ‘И’ | ‘Я’ | ‘ ‘ | ‘И’ | ‘З’ | ‘ ‘ | ‘Ф’ | ‘А’ | ‘Й’ | ‘Л’ | КФ |
Рис. 24.5. –Содержимое текстового файла
Организация ввода и вывода данных с использованием файлов

Список вопросов теста
Вопрос 1
Сколько байтов памяти занимает признак конца строки в текстовом файле?
Вопрос 2
В каком виде хранятся данные на устройствах внешней памяти?
Выберите один из 4 вариантов ответа:
Варианты ответов
Вопрос 3
Без пробелов запишите условие описанного цикла для считывания массива чисел из файла?
Запишите ответ (без пробелов):
Вопрос 4
Какое количество памяти занимает один символ в текстовом файле?
Выберите один из 4 вариантов ответа:
Варианты ответов
Вопрос 5
Укажите верный порядок следования операторов в программе?
Укажите порядок следования всех 4 вариантов ответа:
Варианты ответов
Вопрос 6
Что будет записано в файл f при выполнении оператора writeln ( f )?
Выберите один из 4 вариантов ответа:
Варианты ответов
Вопрос 7
Укажите соответствие между операторами и их описаниями.
Укажите соответствие для всех 4 вариантов ответа:
Варианты ответов
Вопрос 8
При помощи какого оператора текстовый файл открывается для перезаписи?
Выберите один из 4 вариантов ответа:
Варианты ответов
Вопрос 9
Какие разновидности файлов существуют?
Выберите несколько из 4 вариантов ответа:
Варианты ответов
Вопрос 10
Какой тип в языке Pascal имеет файловая переменная, для обращения к текстовому файлу?