пятница, 1 февраля 2013 г.

[Информатика] Файлы текст запись


Файлы.
Текстовые файлы.
Запись данных в текстовый файл.
В современном мире любая программа тем или иным способом связана с внешними файлами.
Файл – это именованная область на диске (носителе информации), в которой записана какая-то информация.
Это могут быть как специальные файлы (например, файлы стандартных библиотек), так и файлы данных, получающихся в результате работы программы. Все файлы имеют свой специфический формат. Эта специфика зависит от типа кодировки информации в файле.
Широкое распространение получили текстовые файлы.
Текстовые файлы состоят из строк (одной или нескольких) произвольной длины в которых могут быть записаны любые символы. Каждая строка текста завершается специальным символом, означающим конец строки, а файл заканчивается символом конца файла. Одной из особенностей текстовых файлов являетсято, что их можно просматривать и редактировать с помощью различных текстовых редакторов, например редактора Notepad (Блокнот) .
Текстовый файл представляет собой совокупность связанных данных, рассматриваемых как единое целое и имеющих общее имя. У текстовых файловпринято ставить расширения .txt, однако наличие данного расширения не гарантирует того, что файл текстовый, равно как и не обязательно то, что текстовый файл будет иметь расширение txt.Приведём примеры стандартных расширений файлов, которые по типу являются текстовыми:.ini, .log, .inf, .dat, .bat. Мы будем использовать расширение .txt.
Ещё одна особенность текстовых файлов заключается в способе доступа к данным, которые в них содержатся. Текстовый файл является файлом последовательного доступа.
В файлах последовательного доступа данные располагаются в том порядке, в каком они поступили в файл – последовательно (друг за другом). Для поиска требуемый данных необходимо последовательно просматривать весь файл - от начала до нужных данных. Следовательно, время доступа к данным находится в прямой зависимости от местоположения в файле.
Такие файлы целесообразно использовать в том случае, если при обращении к файлу обрабатываются почти все данные, а их содержимое меняется достаточно редко. Основной недостаток файлов с последовательным доступом заключается в трудности обновления существующих данных, замены данных на новые, вставки новых данных.
Рассмотрим работу с текстовыми файлами в средеLasarus.
Любая программа не может непосредственно обратиться к диску, обращение происходит только через переменные, которые хранятся в оперативной памяти. Поэтому для работы с файлами нам нужна файловая переменная, которая и будет передаточным звеном между программой и диском. Описывается файловая переменная следующим образом:
Var
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;
12Привет107107
FALSE
10  7
x=10
 
var
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 должны вводиться в соответствующие поля ввода.
После выполнения программы проверьте содержимое файла с помощью текстового редактора (например, Блокнота).