FileCreate
FileCreate creates a new file with name FileName on the disk and returns a file handle which can be used to read or write from the file with the FileRead and FileWrite functions.
If a file with name FileName already existed on the disk, it is overwritten.
The optional Mode parameter only has an effect under unix, where it can be used to set the mode (read, write, execute, sticky bit, setgid and setuid flags) of the created file to the specified custom value. On other platfors, the Mode parameter is ignored.
File Handling In Pascal/ru
Каждый программист должен знать, как работать с файлами. Файлы используются для сохранения данных, т. е. в качестве хранилища данных, таким образом, что они могут быть получены в любой момент, без их воссоздания. Файлы можно использовать для сохранения пользовательских настроек, журналов ошибок, измерение или вычисление результатов, и многое другое. В данном разделе описываются основы использования файлов.
Процедурный стиль
Это довольно старый стиль, использующейся ещё во времена, когда Pascal не был объектно-ориентированным языком. Суть его в том, что задается тип файла, определяющий, какие будут храниться в нем данные. Для этого, используется конструкция вида: file of <тип данных>, где <тип данных> — название типа, который хранит в себе файл. Помимо стандартных типов (integer, extended, char и т.д.), существует особый тип — TextFile. Он определят, что каждая строка заканчивается специальным(ми) символом(ами) конца строки (См. LineEnding). Эти файлы могут быть открыты и отредактированы внутри среды Lazarus или в любом другом текстовом редакторе.
Ниже представлены примеры создания собственных типов файлов:
Обработка ошибок ввода/вывода
Параметр компилятора обработки ошибок ввода/вывода указывает, как должна вести себя программа при возникновении ошибки в процессе работы с файлами: вызвать исключение или хранить результат операции ввода/вывода в специальной переменной IOResult.
Это задаётся с помощью специальной директивы компилятора:
В случаи подавления ошибок ввода-вывода (<$I->) результат операции с файлом будет храниться в переменной IOResult типа cardinal (числовой тип). Каждое число, хранимое в IOResult определяет тип возникшей ошибки(подробнее: [1]).
Процедуры работы с файлами
Эти процедуры и функции находятся в модуле system. Для более подробной информации смотрите документацию FPC:
- AssignFile (не допускайте использование процедуры Assign) — Связывает переменную с файлом
- Append — Открывает существующий файл для записи данных в конец и их редактирования
- BlockRead — Чтение данных из не типизированного файла в память
- BlockWrite — Запись данных из памяти в не типизированный файл
- CloseFile (не допускайте использование процедуры Close) — Закрыть открытый файл
- EOF — Проверка наличия конца файла
- Erase — Стереть файл с диска
- FilePos — Получить позицию в файле
- FileSize — Получить размер файла
- Flush — Записать файловый буфер на диск
- IOResult — Возвращает результат последней операции ввода\вывода
- Read — Считать из текстового файла
- ReadLn — Считать из текстового файла и перейти к следующей строке
- Reset — Открыть файл для чтения
- Rewrite — Создать и открыть файл для записи
- Seek — Изменить позицию в файле
- SeekEOF — Переместить позицию в файле в его конец
- SeekEOLn — Переместить позицию в файле в конец строки
- Truncate — Удалить все данные, после текущей позиции
- Write — Записать переменную в файл
- WriteLn — Записать переменную в текстовый файл и перейти к новой строке
Пример
Пример работы с текстовым файлом (тип TextFile):
Теперь откройте файл в любом текстовом редакторе и вы увидите, что пример текста, записан в нем! Вы можете проверить работу обработки ошибок, установив атрибут файла «только для чтения» и снова запустив программу.
Обратите внимание, что в примере используется блок try/except. Данный способ позволяет выполнять несколько операций с файлами и использовать обработку исключений. Вы также можете использовать режим <$I->, но тогда вам придется проверять переменную IOResult после каждой операции с файлами для контроля ошибок.
Ниже приведен пример записи текста в конец файла:
Чтение текстового файла:
Объектный стиль
В дополнение к старому методу обработки файлов, упомянутому выше процедурному стилю, существует новая система, которая использует концепции потоков (данных) на более высоком уровне абстракции. Это означает, что данные могут считываться или записываться в любом месте (диск, память, аппаратные порты и т. д.) через один универсальный интерфейс.
Кроме того, большинство классов обработки строк, могут иметь возможность загружать/сохранять содержимое из/в файл. Эти методы обычно называются SaveToFile и LoadFromFile.
Двоичные файлы
Для прямого доступа к файлам, так же удобно использовать класс TFileStream. Этот класс представляет собой инкапсуляцию системных процедур FileOpen, FileCreate, FileRead, FileWrite, FileSeek и FileClose, расположенных в модуле SysUtils.
В приведенном ниже примере обратите внимание, что обработка действий с файлом, расположена внутри блока try..except. Поэтому обработка ошибок происходит так же, как в случаи использования процедур работы с файлами в классическом Pascal.
Вы так же можете загрузить весь файл в память, если его размер существенно меньше, чем имеющийся системной памяти. Если файл превышает размер системной памяти, то ваша операционная система начнет использовать файл подкачки, снижая скорость работы с файлом.
Для работы с файлами большого объёма, рекомендуется использовать буфер, например в 4096 байт.
Копирование файла
Теперь,зная методы работы с файлами, мы можем реализовать простую функцию копирования файла, скажем FileCopy.(такой функции нет в FreePascal, хотя Lazarus её имеет copyfile):
Обработка текстовых файлов (TStringList)
Для текстовых файлов можно использовать класс TStringList, чтобы загрузить весь файл в память и иметь легкий доступ к его строкам. Вы также можете записать StringList обратно в файл:
Демо: сохранить одну строку в файл
Для того, чтобы сохранить одну строку в файл, вы можете воспользоваться процедурой, описанной ниже.
Программирование
Данные методические указания являются шестыми из курса указаний для изучения языка Lazarus. В них рассматриваются основные правила по работе с файлами.
Цель работы – изучить принцип работы с файлами и создать приложение, в котором используются файлы с помощью объектно-ориентированного языка Lazarus.
Объявление файла
Файл – это совокупность данных, размещенных на внешнем носителе. Данные в файле называются компонентами. Количество данных в файле, в отличие от массива, в описании файла не указывают. Компонент файла не имеет индекса. Тип компонентов может быть как простым, так и сложным, но не может быть файлом.
Файловый тип можно задать тремя способами. В разделе описания типов:
Type <имя типа>=file of <базовый тип>;
< имя типа >=TextFile;
< имя типа >=File;
В разделе объявления переменных:
Var < имя типа >: file of <базовый тип>;
< имя типа >: TextFile;
< имя типа >: File;
Здесь <имя типа> — имя файлового типа (правильный идентификатор); file of – зарезервированные слова (файл из); TextFile – имя стандартного типа текстовых файлов; <базовый тип> — любой тип Lazarus, кроме файлов.
Type comp=record;
marka: string;
hdd, ram: word;
speed: integer;
end;
Text80= file of string[80];
F1: file of char;
F2: TextFile;
F3: file;
F5: file of comp;
В зависимости от способа объявления можно выделить три вида файлов:
типизированные файлы (задаются предложением file of…);
текстовые файлы (определяются типом TextFile);
нетипизированные файлы (определяются типом file);
В приведенном примере F1, F4 и F5 – типизированные файлы, F2 – текстовый файл, F3 – нетипизированный файл.
Доступ к файлам
Объявление файловой переменной задает только тип компонентов файла. Для того чтобы программа могла выводить данные в файл или считывать данные из файла, необходимо указать конкретный файл, т. е. связать файловую переменную с конкретным файлом (задать имя файла).
Файловая переменная связывается с именем файла в результате обращения к стандартной процедуре AssignFile:
Здесь <ф.п.> — файловая переменная (правильный идентификатор, объявленный в программе как переменная файлового типа); <имя файла > — текстовое выражение, содержащее имя файла и, если это необходимо, маршрут доступа к нему. Например:
AssignFile(f, ‘a:\result.txt’);
AssignFile(f, ‘\students\ivanov\korni.txt’);
fname:=(‘otchet.txt’); AssignFiie(f,fname);
Инициировать файл означает указать для этого файла направление передачи данных. В Lazarus можно открыть файл для чтения, для записи информации, а также для чтения и записи одновременно.
Для чтения файл инициируется с помощью стандартной процедуры Reset:
Здесь <ф. п.> — файловая переменная, связанная ранее процедурой AssignFile с уже существующим файлом.
При выполнении этой процедуры дисковый файл подготавливается к чтению информации. В результате специальная переменная-указатель, связанная с этим файлом, будет указывать на начало файла, т. е. на компонент с порядковым номером 0.
В Lazarus разрешается обращаться к типизированным файлам, открытым процедурой Reset (т. е. для чтения информации), с помощью процедуры Write (т. е. для записи информации). Такая возможность позволяет легко обновлять ранее созданные типизированные файлы и при необходимости расширять их. Для текстовых файлов, открытых процедурой Reset, нельзя использовать процедуру Write или Writeln.
инициирует запись информации в файл, связанный с файловой переменной <ф.п.>. Процедурой Rewrite нельзя инициировать запись информации в ранее существовавший дисковый файл: при выполнении этой процедуры старый файл (если он был) уничтожается и никаких сообщений об этом в программу не передается. Новый файл подготавливается к приему информации, и его указатель принимает значение 0.
инициирует запись в ранее существовавший текстовый файл для его расширения, при этом указатель файла устанавливается в его конец. Процедура Append применима только к текстовым файлам, т. е. их файловая переменная должна иметь тип TextFile. Процедурой Append нельзя инициировать запись в типизированный или нетипизированный файл. Если текстовый файл ранее уже был открыт с помощью Reset или Rewrite, использование процедуры Арpend приведет к закрытию этого файла и открытию его вновь, но уже для добавления записей.
закрывает файл, однако связь файловой переменной с именем файла, установленная ранее процедурой AssignFile, сохраняется. При создании нового или расширении старого файла процедура обеспечивает сохранение в файле всех новых записей и регистрацию файла в каталоге. Функции процедуры CloseFile выполняются автоматически по отношению ко всем открытым файлам при нормальном завершении программы. Поскольку связь файла с файловой переменной сохраняется, файл можно повторно открыть без дополнительного использования процедуры AssignFile
Lazarus: виды программ и первая программа
Чтобы создать первую программу в Lazarus, надо выбрать в меню ФАЙЛ команду СОЗДАТЬ. А в открывшемся окне в группе PROJECT выбрать тип программы и нажать кнопку ОК. Подробности см. в видео.
Lazarus поддерживает следующие типы программ.
Application (Приложение)
Графическая программа на LCLI/FreePascal. Это обычное оконное приложение Windows.
Programm (Программа)
Программа FreePascal. Это обычная программа FrePascal. Если вы читали книгу Как стать программистом, то вы уже писали такие программы.
Console application (Консольное приложение)
Консольное приложение Windows. Это программа FreePascal, использующая класс TCustomApplication, что облегчает проверку параметров командной строки, обработки исключений и т.п. Иными словами, это та же программа FreePascal, которая, однако, позволяет использовать функции Windows.
Library (Библиотека)
Библиотека FreePascal.
Custom programm (Пользовательская программа)
Программа пользователя на языке FreePascal.
CGIApplication (Приложение CGI)
Программа CGI (Common Gateway Interface — общий шлюзовый интерфейс) на языке FreePascal.
FPCUnit Console Application (Консольное приложение FPCUnit)
Консольное тестовое приложение. Это приложение используется для тестирования в консольном режиме.
FPCUnit Application (Приложение FPCUnit)
Тестовое приложение. Это приложение используется для тестирования в графическом режиме.
Мы в своих примерах будем в основном использовать Application и Program.
И сейчас мы напишем нашу первую программу. Для этого в меню ФАЙЛ выбираем команду СОЗДАТЬ. Затем в группе PROJECT выбираем Programm и нажимаем кнопку ОК.
Между словами begin и end пишем код:
Если вы читали книгу Как стать программистом, то вы уже догадались, что эта программа выведет на экран строку “Hello, WORLD. ”.
Я не буду использовать в консольных приложениях русский текст, так как на некоторых компьютерах без вмешательства в настройки операционной системы вместо русских букв будут выводиться “краказябры”. Английские же буквы всегда будут выводиться правильно.
Итак, полный текст программы у вас должен получиться таким:
Проверьте на всякий случай текст ещё раз. Затем в меню ЗАПУСК выберите команду ЗАПУСК (или нажмите клавишу F9). Если вы не допустили ошибок, то программа выполнится и вы увидите на экране строку “Hello, WORLD. ”.
Теперь можно сохранить программу на диске в нашей папке MYPROG. Если сами с этим не справитесь, то смотрите видео.
Домашнее задание:
Создать в папке MYPROG папку 1103. Создать программу (проект) в Lazarus. Сохранить проект в папке 1103. Откомпилировать программу. Запустить программу из папки 1103 (а не из среды разработки). Похвастаться друзьям)))