Запись данных в файл delphi. Классическая работа с файлами в Delphi

Детские товары 21.05.2019

Технология работы с файлами в системе Delphi требует определённого порядка действий:

  1. Прежде всего файл должен быть открыт . Система следит, чтобы другие приложения не мешали работе с файлом . При этом определяется, в каком режиме открывается файл - для изменения или только считывания информации. После открытия файла в программу возвращается его идентификатор, который будет использоваться для указания на этот файл во всех процедурах обработки.
  2. Начинается работа с файлом . Это могут быть запись, считывание, поиск и другие операции.
  3. Файл закрывается. Теперь он опять доступен другим приложениям без ограничений. Закрытие файла гарантирует, что все внесённые изменения будут сохранены, так как для увеличения скорости работы изменения предварительно сохраняются в специальных буферах операционной системы.
В Delphi реализовано несколько способов работы с файлами . Познакомимся со классическим способом, связанным с использованием файловых переменных . Файловая переменная вводится для указания на файл. Делается это с помощью ключевого слова File :

Var F: File ;

Описанная таким образом файловая переменная считается нетипизированной , и позволяет работать с файлами с неизвестной структурой. Данные считываются и записываются побайтно блоками, размер которых указывается при открытии файла, вплоть от 1 байт.

Но чаще используются файлы, состоящие из последовательности одинаковых записей. Для описания такого файла к предыдущему описанию добавляется указание типа записи:

Var F: File of тип_записи ;

В качестве типа могут использоваться базовае типы, или создаваться свои. Важно только, чтобы для типа был точно известен фиксированный размер в байтах, поэтому, например, тип String в чистом виде применяться не может, а только в виде String[N] , как указывалось в уроке Delphi 5 .

Данные, считанные из файла или записываемые в файл, содержатся в обычной переменной, которая должна быть того же типа, что и файловая. Поэтому сначала в программе лично я описываю нужный тип, а затем ввожу две переменные этого типа - файловую и обычную:

Для текстовых файлов отдельно укажу, что тип файловой переменной в этом случае TextFile , а тип обычной - String .

Для открытия файла нужно указать, где он расположен. Для этого файловая переменная должна быть ассоциирована с нужным файлом, который определяется его адресом. Адрес файла может быть абсолютным, с указанием диска и каталогов ("C:\Мои документы\Мои рисунки\FileName.ini"), или относительным, тогда он создаётся в папке с .exe файлом программы. Для задания относительного адреса достаточно указать имя файла с нужным расширением. Делается это оператором AssignFile:

AssignFile(SaveF, "C:\Мои документы\Мои рисунки\FileName.ini");
AssignFile(SaveF, "FileName.ini");

Теперь файл должен быть открыт.
Открытие файла оператором Rewrite приведёт воссозданию файла заново, т.е. существующий файл будет без предупреждения уничтожен, и на его месте будет создан новый пустой файл заданного типа, готовый к записи данных. Если же файла не было, то он будет создан.
Открытие файла оператором Reset откроет существующий файл к считыванию или записи данных, и его указатель будет установлен на начало файла :

Rewrite(SaveF);
Reset(SaveF);

Каждый из этих операторов может иметь второй необязательный параметр, имеющий смысл для нетипизированных файлов, и указывающий длину записи нетипизированного файла в байтах:

Rewrite(SaveF, 1);
Reset(SaveF, 1);

Чтение файла производится оператором Read:

Read(SaveF, SaveV);

Запись в файл производится оператором Write:

Write(SaveF, SaveV);

При этом чтение и запись производится с текущей позиции указателя, затем указатель устанавливается на следующую запись. Можно проверить, существует ли нужный файл, оператором FileExists:

if FileExists("FileName.ini")
then Read(SaveF, SaveV);

Принудительно установить указатель на нужную запись можно оператором Seek(SaveF, N) , где N - номер нужной записи, который, как и почти всё в программировании, отсчитывается от нуля:

Seek(SaveF, 49); - установка указателя на 50-ю запись.

При последовательном чтении из файла рано или поздно будет достигнут конец файла, и при дальнейшем чтении произойдёт ошибка. Проверить, не достигнут ли конец файла, можно оператором EOF (аббревиатура E nd O f F ile), который равен true , если прочитана последняя запись и указатель находится в конце файла:

while (not EOF(SaveF)) do
Read(SaveF, SaveV);

Для текстовых файлов вместо Read и Write используются операторы Readln и Writeln , умеющие определять конец строки. В коментариях приведена процедура чтения текстового файла.

Оператор Truncate(SaveF) позволяет отсечь (стереть или, если хотите, удалить!) все записи файла, начиная от текущей позиции указателя, и до конца файла.

В конце работы с файлом его необходимо закрыть. Это делается оператором CloseFile(SaveF) ;

Теперь можно изменить программу из первой части урока, запоминающую своё положение на экране. Описание переменных опускаю, оно приведено на рисунке выше.

Создаём обработчик события Формы OnCreate со следующим содержимым:

procedure TForm1.FormCreate(Sender: TObject) ;
begin
AssignFile(SaveF, "Init.ini") ;
if FileExists("Init.ini") then
begin
Reset(SaveF) ;
Read(SaveF, SaveV) ;
Form1.Left:= SaveV.X ;
Form1.Top:= SaveV.Y ;
Form1.Caption:=SaveV.Caption ; //Наши переменные дополнительно сохраняют заголовок Формы!
end ;
end ;

Теперь необходимо создать обработчик события OnClose:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction) ;
begin
Rewrite(SaveF) ; //Нет необходимости проверять наличие файла, создадим его заново!
SaveV.X:= Form1.Left ;
SaveV.Y:= Form1.Top ;
SaveV.Caption:= Form1.Caption ;
Write(SaveF, SaveV) ;
CloseFile(SaveF) ;
end ;

В данном случае файл считывается и записывается туда, куда мы ему указали. Но необходимо также уметь выбрать нужный файл в работающей программе. Описание этого - в

Несмотря на то, что в Delphi существует несколько методов, позволяющих взаимодействовать с файлами, технология работы подразумевает под собой соблюдение определенного порядка действий:

1. Файл обязательно должен быть открыт. Другие приложения не должны мешать работе с файлом, за этим тщательно следит система. Одновременно с этим система определяет, для каких целей открывается файл. Здесь существует несколько вариантов: для чтения или для внесения изменений.

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

3. После того, как все необходимые действия будут выполнены и запись в файл осуществится, документ закрывается. С этого момента он становится доступным для других приложений совершенно без ограничений. Стоит отметить, что закрытие файла является гарантией того, что все внесенные корректировки будут сохранены. Таким образом, запись в файл Delphi необходимых данных успешно завершена .

Если данная задача кажется достаточно сложной, то можно обратиться за помощью к профессионалам, которые помимо Delphi знают все необходимое про администрирование linux.

Запись в текстовый файл Delphi

В Delphi файл представляется в виде последовательности однотипных данных. Иначе говоря, это достаточно большой массив, размер которого практически ничем не ограничен. Для того чтобы облегчить запись в текстовый файл Delphi, каждый документ представлен в виде файловой переменной.

Для работы с текстовыми документами применяется тип TextFile, который записывается так:

Var Переменная: Тип TextFile;
Для получения доступа к файлу следует воспользоваться процедурой AssignFile() . После того, как доступ к файлу получен, его можно открыть при помощи процедур Reset, Rewrite . Если говорить более подробно, то процедура Reset() открывает ранее созданный документ, а процедура Rewrite() позволяет создать новый файл или же очистить существующий. Закрывается файл при помощи специальной процедуры CloseFile. Осуществить запись в текстовый файл Delphi можно при помощи таких процедур, как Write или WriteLn.

Запись в excel
В том случае, если необходимо выполнить запись в excel Delphi, нужно воспользоваться определенным алгоритмом действий. Для начала создается вариантный массив, затем в этот массив заносятся данные и при помощи одной операции весь этот массив записывается в файл excel. Стоит отметить тот факт, что запись в excel очень актуальна в последнее время, так как именно этот редактор широко используется и для разработки различных отчетов и печатных форм.

Когда речь идет о работе программы с текстовым файлом, подразумеваются процедуры ввода данных из файла в программу или, наоборот, запись этих данных в файл программой. Для текстового файла допустима простая работа с файлом без особых дополнительных механизмов, которые применяются для работы со специализированными файлами, такими как при загрузке данных из Excel или работе программы с базой данных . Разумеется, Delphi располагает возможностями работать с файлами с использованием компонентов. Но в данной статье рассматривается механизм прямой работы с текстовым файлом без использования дополнительных компонентов.

Итак, в общем виде, работа с файлом заключается в следующих этапах:

1. подключение к файлу – связь с внешним файлом, указание режима подключения;

2. выполнение операций записи в файл или чтения из файла;

3. завершение работы с файлом.

Подключение к файлу

Для связи программы с файлом используется специальная переменная – "Файловая переменная". Объявляется она так же как и любая переменная в Delphi. Тип это переменной может быть File для типизированных (хранящих данные определенного типа) файлов, а можно указать TextFile , что будет означать тип обычного текстового файла. Объявление переменной:

var
f: TextFile;

В исполняемом коде программы выполняется подключение к внешнему файлу:

AssignFile(f, "input.txt" );

Команда AssignFile , выполняет связь файловой переменной с внешним файлом. Вторым параметром указывается адрес файла. Он может быть задан относительным или абсолютным. Если указать только имя файла, то программа будет пытаться обнаружить его в той же директории, где она сама и находится. Абсолютный путь указывается от корневого диска:

AssignFile(f, "C:\myprog\input.txt" );

Использование относительной директории дает возможность не привязываться к конкретным дискам и адресам. Например:

AssignFile(f, "data\input.txt" ); // во вложенной папке относительно директории с программой
AssignFile(f, "..\input.txt" ); // на уровень выше директории с программой
AssignFile(f, "..\data\input.txt" ); // во вложенной папке на уровень выше директории с программой

После того как выполнено подключение, выполняется процедура, устанавливающая режим работы с файлом. В основном это режим чтения или записи. Эти режимы назначаются процедурами Reset() (для чтения) и rewrite() (для записи):

Reset(f);
Rewrite(f);

* Для команды Rewrite() следует учитывать, что при ее выполнении, она либо создает файл, указанный в файловой переменной, либо если он уже есть перезаписывает файл заново, удаляя старый без какого-то предупреждения.

Любую из указанных команд можно использовать без команды AssignFile() . Для этого достаточно вторым параметром указать путь к файлу. Таким образом, она сразу выполнит привязку файла к файловой переменной и назначит режим работы с этим файлом:

Reset(f, "C:\myprog\input.txt" ); // чтение
Rewrite(f, "C:\myprog\input.txt" ); // запись

Операции с файлами

Для чтения из файла, необходимо назначить режим чтения и использовать команду Readln() , которая будет вводить в строковую переменную по одной строке из файла. Затем с этой переменой можно выполнить необходимые действия.

Readln(f, s);

Обычно для загрузки всех строк из файла используется оператор цикла. Для того, чтобы определить, что файл закончился используется функция EOF() (End Of File). Таким образом получается цикл, в котором последовательно в строковую переменную вводятся все строки файла и завершающийся после окончания фала:


Readln(f, s);
end ;

Для записи, назначение режим записи в файл и командой Writeln() производится запись по строкам.

Writeln(f, "text" );

Закрытие файла

По завершении работы с файлами, особенно в случае записи в них данных, необходимо корректно завершить работу с файловой переменной. Это делается для того, чтобы сохранить все внесенные в файл изменения.

CloseFile(f);

Примеры работы с текстовыми файлами в Delphi

Чтение в переменную одного значения из файла:

var
f: TextFile;
s: String;
begin
AssignFile(f, "input.txt" );
Reset(f);

Readln(f, s);

CloseFile(f);
end ;


Загрузить все строки файла в компонент Memo:

var
f: TextFile;
s: String;
begin
AssignFile(f, "input.txt" );
Reset(f);

while (not EOF(f)) do begin
Readln(f, s);
myMemo.Lines.Add(s);
end ;

CloseFile(f);
end ;

Следует отметить, что для этой задачи проще воспользоваться командой самого компонента Memo LoadFromFile() .

myMemo.Lines.LoadFromFile("input.txt" );


Записать строку в файл:

var
f: TextFile;
begin
AssignFile(f, "input.txt" );
Rewrite(f);

Writeln(f, "My text" );

CloseFile(f);
end ;


Записать в текстовый файл все строки из компонента Memo:

var
f: TextFile;
i: Integer;
begin
AssignFile(f, "input.txt" );
Rewrite(f);

for i:= 0 to myMemo.Lines.Count - 1 do
Writeln(f, myMemo.Lines[i]);
CloseFile(f);
end ;

Как и для чтения из файла в Memo, так и здесь, имеется специальная команда:

myMemo.Lines.SaveToFile("input.txt" );

Мы подробно рассмотрим, как копировать, удалять, переименовывать файлы. Научимся считывать и записывать информацию в типизированные файлы.

Копирование файлов с помощью .

Для этого нам потребуется вызов всего одной функции, которая выполняет именно копирование файлов. Это функция CopyFile(). У нее три параметра, два из которых обязательны. Вот полный синтаксис.
CopyFile("путь до начального файла","Путь куда надо копировать",Перезаписывать или нет)

Пример: CopyFile("D:sekretBD.txt","C: ame.txt", true);

В первом параметре можно указывать не только полный путь до файла. Если укажем, например, такой путь "sekretBD.txt", то наша программа будет искать этот файл в своем каталоге. Имя и разрешение нужно указывать именно такими, какие они есть у файла, иначе программа просто не найдет файл.
Во втором параметре тоже можно указывать относительный путь и там вы можете указать имя и расширение файла такое, какое захотите. Т.е. с помощью этой функции можно делать и переименовывание тоже.
Третий параметр отвечает за перезапись файла. Если мы укажем true, то файл не будет перезаписан, а если false, то программа перезапишет файл.

Переименование файлов с помощью

За переименование файлов отвечает функция RenameFile(). У нее 2 параметра. Вот ее полный синтаксис
RenameFile("путь до файла","новое имя");
Честно говоря, синтаксис этой функции меня не особо радует. В нем тоже в обоих параметрах надо указывать полный путь. Т.е. если мы, например, напишем так

RenameFile("C:2.txt","3.txt");

То он скопирует файл в каталог программы. Т.е. получается, что она может выполнять роль копирования тоже. Это немного странно.

Удаление файлов с помощью

Ну здесь все совсем просто. Функция, с помощью которой можно удалить файл, вызывается так:

DeleteFile("C:myprofile.txt");

Единственное, что она не всегда 100% удаляет файл. Когда файл защищен, она его не сможет удалить.

Работа с типизированными файлами в

Что такое типизированный файл? Это файл с определенной структурой. Обычно это структурой выступают записи и базовые типы. В общем, важно, чтобы у типа был известен фиксированный размер, поэтому тип string применять нельзя, нужно делать так: String[N].
Вначале нам нужно объявить переменную, где будут храниться данные из файла. Делается это так:

Var f: file of <Тип>
Например, f: file of string;

Затем нам нужно соединиться с файлом. Для этого есть команда AssignFile. Для вызова надо прописать два параметра, это переменная, которую мы объявили выше и путь до файла. Например

AssignFile(f,"C:delphi.ini");

Теперь файл нужно открыть. Можно открыть двумя способами: с перезатиранием и без. Метод Rewrite открывает файл, предварительно создав его. Т.е. если файла в указанном нами пути не будет находиться, то он его создаст. Если там уже был такой файл, то он будет удален и заново создастся чистый файл. Метод Reset открывает файл и ставит указатель в самое начало файла. Но этот метод опасен тем, что если файла, указанного в подключении, нет, то программа вылетит с ошибкой. Так что для правильного применения функции Reset надо сказать компилятору об отключении ошибок. Задается это директивой {$I-} т.е. полный синтаксис функции reset будет таким:

{$I-}
Reset(f);
{$I+}

После этого надо проверить, был ли открыт файл или нет. Это можно сделать с помощью функции IOResult. Если она не равна нолю, то все успешно.
Полный синтаксис:

{$I-}
Reset(f);
{$I+}
If IOresult <> 0 then <ваш код>

Также осуществить проверку поможет функция FileExists. В ней нужно указать путь до файла.
Для чтения файла служит функция Read(), в которой указываются два параметра: переменная файла и тип записи, в нашем случае это string. Синтаксис:

Для записи в файл служит функция Write(), в которой указываются такие же два параметра: переменная файла и тип записи, в нашем случае это string. Синтаксис:

While not eof(f) do
Read(f,String);

Также есть функция seek, с помощью которой мы можем перейти на интересующую нас запись. Например, нам нужно обратиться к 20 записи и мы делаем так:

Еще есть функция truncate, С помощью которой мы можем удалить все записи файла, начиная от позиции указателя. Позицию можно указать с помощью функции seek, кто не понял.

После выполнения всех операций с файлом, необходимо его закрыть с помощью функции CloseFile(f);
Вот и все. На этом урок закончен. До встречи на сайте!


1) Направление выходного потока вашей программы в файл.
2) Направление выходного потока вашей программы на принтер.
3) Чтение из входного файла.

Направление выходного потока вашей программы в файл

Часто мои профессора, чтобы убедиться в моей честности и поверить в то, что программа создана моими руками, требуют ее полный листинг или упоминания обо мне в качестве одного из авторов. Далее они хотят, чтобы все генерируемые программой данные выводились в файл. Но как это сделать на Delphi или на простом Паскале???

Просто в Delphi ....


Направление выходного потока вашей программы на принтер

В некоторых случаях может возникнуть необходимость печатать генерируемые программой данные непосредственно на принтер. Вот как это можно сделать:


Чтение из входного файла

Весьма полезным будет иметь функцию чтения из файла, который может передаваться другим человеком. Вот пример того, как это можно осуществить.


В Паскале...


{НАЧАЛО INFILE.TXT} 2 Здравствуй, мир Моя программа работает, и этот текст доказательство этому. {КОНЕЦ INFILE.TXT} Для получения дополнительной информации обратитесь к Руководству Разработчика. Ознакомьтесь с описанием функций AssignFile, Assign, Reset, Rewrite, readln, writeln, Close, CloseFile.

Рекомендуем почитать

Наверх