Источник: codingclub
Сегодня я расскажу вам о такой важной особенности языка программирования, как работа с файлами. Мы будем копировать, вставлять, вырезать, удалять файлы и все это на Delphi. Функции работы с файлами там почти аналогичны Паскалевским, различия я буду указывать по ходу.
Прежде всего, нам нужна переменная для работы с файлами. Например, объявим переменную f1типа file of char. Можно также взять file of byte или file of integer. Для Паскаля это может быть просто text (текстовый файл). Учтите, что если вы объявляете переменную как file of char, то переменная, в которую будут заноситься данные, должна быть описана как byte.
После объявления переменной вы должны связать ее с определенным файлом, делается это при помощи процедуры assignfile (assign для Паскаля). Запись assignfile(f1,’c:autoexec.bat’) свяжет переменную f1 с указанным файлом. Далее все операции, которые мы будем проводить над переменной f1, будут происходить со связанным с ней файлом. Но пока мы еще не имеем доступа к файлу. Сначала надо указать, для чего мы будем его использовать. Есть три варианта: reset (чтение), rewrite (запись с удалением старого содержимого), append (запись в конец файла, с сохранением старого содержимого). Все эти процедуры принимают в качестве единого аргумента имя переменной, которая связана с файлом. После того, как вы указали способ работы с файлом, вы можете с ним работать.
Многие из функций сходны с теми, которые работают с экраном. Не существует отдельной процедуры вывода текста в файл, это делается при помощи той же writeln writeln(f1,’Hello world’). Без указания начального аргумента надпись была бы выведена на устройство по умолчанию, но поскольку в начале указан аргумент f1, ‘Hello world’ выведется в файл, связанный с этой переменной. Для чтения используйте конструкцию read(f1, s1);. f1: file of <тип>; s1 <тип>.
Очень удобными заменами для read и write являются процедуры BlockRead и BlockWrite. Процедура BlockRead(f1, buf, i) читает i записей из файла, связанного с f1, в буфер buf. BlockWrite(f1, buf, i) записывает i записей из буфера buf в файл, связанный с переменной f1. На практике эти две процедуры используются намного чаще обычных read и write.
Хорошим стилем программирования считается закрывать файл после его использования. В принципе, Windows делает это автоматически при завершении работы вашей программы, но разве в наше время можно кому-то доверять (особенно Винде)? Для закрытия файла используется процедура CloseFile(f1); (в Паскале просто close(f1)).
Для того, чтобы удалить файл, используйте процедуру Erase(f1). Для переименования файла существует процедура Rename(f1, NewFileName). FileSize(f1) возвращает размер файла в байтах. FilePos(f1) возвращает текущую позицию файла. Началу файла соответствует 0.
Есть еще две полезные процедуры для работы с текстом, eoln(f1) конец строки в файле, связанном с переменной f1; eof(f1) конец файла. Они часто используются в циклах, когда считывается несколько байт и сразу записывается в другой файл:
While not eof(f1) do begin
Read(f1, str);
Write(f2, str);
End.
Процедуру eoln можно использовать для подсчета строк в файле или, например, для подсчета символов в строке:
While not eoln(f1) do
Inc(int); //увеличение переменной на 1 (++ для C#)
Если вы не хотите, чтобы появлялись окна с ошибкой ввода-вывода (I/O), нужно отключить директиву I. Для отключения напишите {$I-}, а если вы захотите вновь включить ее, наберите {$I+}. Вы можете вставлять свои толкования ошибки, игнорируя системные. Переменная, в которой содержатся коды ошибок, называется IOResult. Она встроенная, ее не надо объявлять, а пользоваться можно как обычной, но ей нельзя присваивать значения (да в этом и смысла нет). Вы можете отключить контроль ошибок ввода-вывода и сами начать отлавливать эти ошибки, проверяя на определенных этапах переменную IOResult. После операций с файлами вы можете делать обычную проверку:
If IOResult<>0 then showmessage(«Ошибка при работе с файлом»);
А можно отлавливать идентификатор ошибки и объяснять пользователю, в чем в суть ошибки:
Case IOResult of
0: showmessage(«Ошибок не было!»);
1: showmessage(«Файл не найден!»);
3: showmessage(«Маршрут не найден!»);
4: showmessage(«Слишком много открытых файлов!»);
5: showmessage(«Запрет доступа к файлу!»);
12: showmessage(«Некорректный код доступа к файлу!»);
Это самые основные коды ошибок при работе с файлами, остальные коды можно узнать по справкам…
Пример
Я не хочу пичкать вас сухой теорией, так что вот вам немного практики. Я приведу простенький пример программы, которая меняет содержимое двух файлов. Программа на Делфи, но, как вы уже убедились, переписать ее на Паскаль не составит труда.
var
f1, f2, f3: file of char;
cop: char;
begin
assignfile(f1,edit1.text); //edit1.text путь к первому файлу
assignfile(f2,edit2.Text); //edit2.text путь ко второму файлу
assignfile(f3,'c:ClipBoard.txt'); //блокнот, который будет служить буфером обмена
//переносим все из первого файла в наш буфер
reset(f1);
rewrite(f3);
while not eof(f1) do begin
read(f1,cop);
write(f3,cop);
end;
closefile(f1);
closefile(f3);
//из второго все переписываем в первый
reset(f2);
rewrite(f1);
while not eof(f2) do begin
read(f2,cop);
write(f1,cop);
end;
closefile(f1);
closefile(f2);
//и, наконец, из буфера, в котором находится содержимое первого файла, записываем во второй файл
reset(f3);
rewrite(f2);
while not eof(f3) do begin
read(f3,cop);
write(f2,cop);
end;
closefile(f2);
closefile(f3);
erase(f3); //удалим наш буферный файл
showmessage('Теперь содержимое файла '+edit1.text+' находится в файле '+edit2.text+' и наоборот…'); //сообщим об успехе операции при ее завершении…
end;
end;
Для ясности можете посмотреть скриншот программы на рис.1.
Эпи.log
Вряд ли кто-то оспорит тот факт, что работа с файлами является одной из важнейших особенностей любого языка программирования. Думаю, теперь у вас появятся новые горизонты в программировании и новые идеи для написания интересных программ.