Файлы.
Текстовые файлы.
Запись данных в
текстовый файл.
В современном мире любая программа тем или иным
способом связана с внешними файлами.
Файл – это
именованная область на диске (носителе информации), в которой записана какая-то
информация.
Это могут быть
как специальные файлы (например, файлы стандартных библиотек), так и файлы
данных, получающихся в результате работы программы. Все файлы имеют свой
специфический формат. Эта специфика зависит от типа кодировки информации в
файле.
Широкое
распространение получили текстовые
файлы.
Текстовые
файлы состоят из строк (одной или нескольких) произвольной длины в которых
могут быть записаны любые символы. Каждая строка текста завершается специальным
символом, означающим конец строки, а файл заканчивается символом конца файла. Одной
из особенностей текстовых файлов являетсято, что их можно просматривать и
редактировать с помощью различных текстовых редакторов, например редактора Notepad (Блокнот) .
Текстовый
файл представляет собой совокупность связанных данных, рассматриваемых как
единое целое и имеющих общее имя. У текстовых файловпринято ставить расширения
.txt, однако наличие данного
расширения не гарантирует того, что файл текстовый, равно как и не обязательно
то, что текстовый файл будет иметь расширение txt.Приведём примеры стандартных расширений файлов,
которые по типу являются текстовыми:.ini,
.log, .inf, .dat, .bat.
Мы будем использовать расширение .txt.
Ещё одна особенность
текстовых файлов заключается в способе доступа к данным, которые в них
содержатся. Текстовый файл является файлом последовательного доступа.
В файлах
последовательного доступа данные располагаются в том порядке, в каком они
поступили в файл – последовательно (друг за другом). Для поиска требуемый
данных необходимо последовательно просматривать весь файл - от начала до нужных
данных. Следовательно, время доступа к данным находится в прямой зависимости от
местоположения в файле.
Такие файлы
целесообразно использовать в том случае, если при обращении к файлу
обрабатываются почти все данные, а их содержимое меняется достаточно редко.
Основной недостаток файлов с последовательным доступом заключается в трудности
обновления существующих данных, замены данных на новые, вставки новых данных.
Рассмотрим
работу с текстовыми файлами в средеLasarus.
Любая
программа не может непосредственно обратиться к диску, обращение происходит
только через переменные, которые хранятся в оперативной памяти. Поэтому для
работы с файлами нам нужна файловая переменная, которая и будет передаточным
звеном между программой и диском. Описывается файловая переменная следующим
образом:
Var
f:TextFile;
f:TextFile;
В программе
необходимо поставить в соответствие файловую переменную и файл, который будет
создан или уже существует на диске. ЭтоделаетсяприпомощипроцедурыAssignFile, которая
имеет два параметра. В качестве первого параметра указывается файловая
переменная, а второго – строка, прописывающая локальный или полный путь к
файлу.
procedure TfrmEx1.btnEx1Click(Sender: TObject);
var
f:TextFile;
begin
AssignFile(f,'my.txt');
end;
В данном
примере мы поставили в соответствие файловую переменную f и файл с именем my.txt, который находится (или будет находиться) в текущей
директории (в директории, из которой запущена программа). Это не полное имя
файла. Если мы полностью указываем путь к файлу (если, например, файл находится
не в текущей директории), то это будет полное имя файла.
Внимание: связывание файловой
переменной с именем файла с помощью оператора AssignFile не
проверяет, существует такой файл или нет, и не открывает существующий файл, и
не создаёт новый файл
Если в имени
файла (или пути) присутствуют русские буквы, то необходимо воспользоваться
функцией UTF8ToANSI.
Например,
связывание файла 'проба.txt' с файловой
переменной будет выглядеть следующим образом
AssignFile(f, UTF8ToANSI('проба.txt'));
В текстовый
файл информацию можно записывать или считывать из файла. Причём можно делать
только что-то одно. Нельзя одновременно писать и читать.
Чтобы
производить какие-либо операции с файлом, его необходимо открыть.
Соответственно открыть его можно либо для записи в файл, либо для чтения из
файла.
Рассмотрим
сначала, как можно писать в файл.
Чтобы
открыть файл для записи, необходимо воспользоваться оператором Rewrite(f), где f - файловая переменная.
При этом, на
диске создаётся пустой файл с именем, указанным в операторе AssignFile.Если файл с
таким именем уже был, то его содержимое уничтожается.
Теперь в
файл можно записывать информацию. Для записи данных в файл используются операторы write иwriteln. Эти
операторы работают почти так же, как и при выводе на экран, только в начале
необходимо указывать файловую переменную, чтобы указать, что вывод будет не на
экран, а в соответствующий файл.
Ниже
приведён пример процедуры, которая записывает различную информацию в текстовый
файл с именем ‘пример.txt’
Procedure ZapFile;
|
f:TextFile;
x,y:integer;
Ok:boolean;
begin
AssignFile(f,UTF8ToANSI(’пример.txt’));
ReWrite(f);
x:=10;
y:=7;
Writeln(f,x); // В файл в первую строку
запишется 10, и курсор перейдёт на вторую строку.
Write(f,x+2); ); // В файл во вторую строку запишется 12 (10+2), и курсор останется в
конце второй строки
Write(f,'Привет'); ); // В файл в конец второй строки (там, где стоит курсор) запишется слово
«Привет», курсор останется в конце второй строки.
Write(f,x,y); //
В файл в конец второй строки (там, где стоит курсор) запишется 10 и 7 без
пробела, курсор останется в конце второй строки.
Writeln(f,x,y); );
// В файл в конец второй строки (там, где стоит курсор) запишется 10 и 7 без
пробела, курсор переместится на третью строку.
Ok:=5>7;
Writeln (f,Ok); //
В файл в третью строку запишется значение переменной Ok - False, курсор переместится на
следующую (четвертую) строку.
Writeln(f,x,' ',y); //
В файл в четвёртую строку запишется значение переменных x – 10 и y – 7
через два пробела, курсор переместится на пятую строку.
Writeln(f,'x=',x); //
В файл в четвёртую строку запишется x=10.
CloseFile(f);
end;
Обратите
внимание, что функциюUTF8ToANSI необходимо использовать, если русские символы
присутствуют только в имени файла или пути, но для вывода русского текста в
файл никаких функций перевода использовать не надо.
Замечание: Так как
довольно часто в именах папок или файлов присутствуют русские буквы, а так же,
если имя файла вводится пользователем, и мы не можем исключить ситуацию, что
могут быть введены русские буквы, то всегда следует использовать функциюUTF8ToANSIв операторе AssignFile.
Так же можно
заметить, что после всех операций вывода в файл стоит процедура CloseFile(f).Эту
процедуру необходимо всегда использовать после окончания работы с
файлом, Она закрывает файл. Если убрать эту процедуру, то часть информации
будет потеряна.
Как было
сказано выше, оператор Rewrite всегда
создаёт новый файл. Однако бывает необходимо дописать информацию к уже
имеющемуся файлу. В этом случае файл необходимо открыть для добавления в него
информации с помощью процедуры Append(f) (вместо
процедуры Rewrite). При
использовании процедуры Append(f) не
создаётся новый файл, а открывается существующий, и курсор устанавливается в
конец файла. Соответственно все операторы write иwriteln будут
выводить информацию в файл, начиная с того места, где стоит курсор и далее.
Открывать
файл с помощью процедуры Append(f)можно,
только если такой файл существует, в противном случае произойдёт ошибка и выполнение
программы прервётся. После окончания работы с файлом необходимо тоже закрыть
его с помощью процедуры CloseFile(f).
Если файл
передаётся в процедуру как параметр, то данный параметр всегда должен быть описан как параметр-переменная, т.е. с помощью слова var.
Рассмотрим
пример программы, которая создаёт два файла ‘проба1.txt’ и ‘проба2.txt’ и записывает в них ноли следующим образом – в
первом файле 3 строки по 5 нолей, во втором 4 строки по 3 ноля. Ноли отделены
друг от друга двумя пробелами.
procedureZapZero(varfl:TextFile;n,m:integer);
var
i,j:integer;
begin
Rewrite(fl);
for i:=1 to n
do
begin
for j:=1 to m
do
write(fl,0:3);
writeln(fl)
end;
CloseFile(fl)
end;
procedure
TForm1.Button1Click(Sender: TObject);
var
f,g:TextFile;
begin
AssignFile(f,UTF8toANSI('проба1.txt'));
AssignFile(g,UTF8toANSI('проба2.txt'));
ZapZero(f,3,5);
ZapZero(g,4,3);
end;
Задачи.
Задача 1.
Создать
текстовый файл, состоящий из nстрок. В
каждой строке по mчисел. Под
каждое число должно быть отведено 5
позиций. В первой строке все числа должны быть единицы, во второй – двойки, в
третьей тройки и т.д. Имя файла, числаn и m должны
вводиться в соответствующие поля ввода.
После
выполнения программы проверьте содержимое файла с помощью текстового редактора
(например, Блокнота).
Например,
если в качестве n и mбыли введены соответственно числа 4 и 3, то в файле
должно быть записано следующее
1
1 1
2
2 2
3
3 3
4
4 4
Задача 2.
Создать
текстовый файл, состоящий из nстрок. В
каждой строке по mчисел. Под
каждое число должно быть отведено 5
позиций. Первое число в каждой строке
должно быть единица, второе – двойка, третье -
тройка и т.д. Имя файла, числаn и m должны
вводиться в соответствующие поля ввода.
После
выполнения программы проверьте содержимое файла с помощью текстового редактора
(например, Блокнота).
Например,
если в качестве n и mбыли введены соответственно числа 4 и 3, то в файле
должно быть записано следующее
1
23
1
2 3
1
2 3
1
2 3
Задача 3.
Создать
текстовый файл, состоящий из nстрок. В
каждой строке по nцифр без
пробелов. Перваяцифра в первой строке, вторая цифра во второй строке, третья
цифра в третьей строке и т.д. должны быть единицы, все остальные цифры - ноли.
Имя файла и числоn должны вводиться в соответствующие поля
ввода.
После
выполнения программы проверьте содержимое файла с помощью текстового редактора
(например, Блокнота).
Например,
если в качестве nбыло введено
число5, то в файле должно быть записано следующее
10000
01000
00100
00010
00001
Задача 4.
Создать
текстовый файл, состоящий из nстрок. В
каждой строке по nцифр без
пробелов. Последняя цифра в первой строке, предпоследняя цифра во второй
строке, и т.д. должны быть единицы, все остальные цифры - ноли. Имя файла и
числоn должны вводиться в соответствующие поля
ввода.
После
выполнения программы проверьте содержимое файла с помощью текстового редактора
(например, Блокнота).
Например,
если в качестве nбыло введено
число 5, то в файле должно быть записано следующее
00001
00010
00100
01000
10000
,,,Задача 5.
Создать
текстовый файл, состоящий из nстрок. В
каждой строке записаны числа, количество которых случайно. При этом чисел в
строке не может быть меньше 2
и большеm. Под каждое
число должно быть отведено 5
позиций. Каждое число случайно и лежит в диапазоне [a,b]. Имя файла,
числаa,b, n и m должны
вводиться в соответствующие поля ввода.
После
выполнения программы проверьте содержимое файла с помощью текстового редактора
(например, Блокнота).
Задача 6.
Создать
текстовый файл, состоящий из nстрок. В
каждой строке должны быть записаны слова, отделённые друг от друга одним
пробелом. Количество слов случайно. При этом слов в строке не может быть меньше
2 и больше m. Длина каждого слова случайна, но не может быть
меньше одного символа и больше 10. Каждый символ в слове – случайная маленькая
русская буква. Имя файла, числаn и m должны
вводиться в соответствующие поля ввода.
После
выполнения программы проверьте содержимое файла с помощью текстового редактора
(например, Блокнота).