Лекция 19. Работа с текстовыми файлами
В этой лекции вы познакомитесь с методами чтения текста из файла, и записи текста в файл. Научитесь пользоваться объектом TStringList, освоите файловый тип TFileStream.
TStringList
Практически любая программа взаимодействует с какими-либо типами файлов. Delphi позволяет нам работать с файлами различных типов. Текстовый файл – одна из этих разновидностей. В этих файлах информация расположена не сплошным блоком данных, а в виде строк, которые заканчиваются символом конца строки и перевода каретки. Можно работать с текстовыми файлами общим способом, то есть, побайтно считывать и записывать данные. Однако это не всегда удобно. Рассмотрим пример:
Привет!
Как жизнь?
Если мы считаем эти 2 строки сплошным блоком, то получим строку:
'Привет!' + #13 + #10 + 'Как жизнь?'
Это очень неудобно, так как для обработки строк нам каждый раз придется искать эти два символа конца строки. А если строк много, например 100? И если нужно получить доступ к 75-й строке?
Тут на помощь приходит объект TStrings, который мы использовали при обработке Memo, и который является простым контейнером для хранения строк. Однако использовать объект TStrings напрямую нельзя, так как этот объект является шаблоном для других объектов, работающих со строками. Вспомните, в компоненте Memo и ListBox мы тоже не использовали этот объект напрямую, мы использовали его "потомков" - Lines и Items. Поэтому лучше использовать более продвинутый вариант этого объекта – TStringList. Этот вариант наследует все возможности объекта TStrings и добавляет еще новые. Это, пожалуй, самый простой способ работы с текстовыми файлами.
Чтобы воспользоваться этим объектом, требуется вначале объявить переменную этого типа, затем проинициализировать ее, а в конце закрыть. В простейшем варианте это будет выглядеть так:
var
f : TStringList; //объявили переменную - объект
begin
f := TStringList.Create(); //проинициализировали
f.Free; //освободили (уничтожили)
end;
Здесь мы создаем объект и тут же его уничтожаем, не работая с ним. Когда мы объявили переменную типа объект TStringList, мы указали компилятору, сколько оперативной памяти потребуется выделить в дальнейшем для этой переменной. Когда мы проинициализировали объект методом Create, мы выделили под него оперативную память. В дальнейшем, с этим объектом можно работать, записывать в него текст, считывать текст, пользоваться свойствами, методами и событиями этого объекта. Метод Freeразрушает объект, уничтожает его в оперативной памяти. После этого к переменной f типа TStringList обращаться уже нельзя. Все, что должен был делать этот объект, должно быть описано до метода Free.
Чтение и запись с таким объектом происходит знакомым нам способом. Допустим, нам нужно прочитать текстовый файл и изменить в нем 10-ю строку:
var
f : TStringList;
begin
f := TStringList.Create();
//читаем текст из файла:
f.LoadFromFile('c:\myfile.txt');
//меняем текст 10-й строки (строки начинаются с 0):
f[9] := 'Новая строка';
//сохраняем измененный текст обратно в файл:
f.SaveToFile('c:\myfile.txt');
f.Free;
end;
Обратите внимание, что мы обратились к 9-му индексу, так как нумерация индексов начинается с нуля, и f[9] содержит 10-ю строку.
Свойство Count этого объекта возвращает общее количество строк, начиная с первой. Давайте напишем пример, в котором мы будем среди всех строк искать строку "Привет, Москва!". Если такая строка будет найдена, то программа выведет номер искомой строки, иначе выведет сообщение, что такой строки нет.
Вначале воспользуйтесь собственным редактором текстов и создайте текстовый файл, куда запишите 10-15 строк. Одну из строк сделайте "Привет, Москва!".
Затем делаем новое приложение, устанавливаем кнопку "Выполнить" и диалог OpenDialog. Затем создаем обработчик событий для кнопки, куда записываем следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
f : TStringList;
i : Integer;
begin
//если ничего не открыли, выходим из процедуры:
if not OpenDialog1.Execute then Exit;
//читаем из файла:
f := TStringList.Create();
f.LoadFromFile(OpenDialog1.FileName);
//ищем строку:
for i := 0 to f.Count-1 do begin
if f[i] = 'Привет, Москва!' then begin
ShowMessage('Строка найдена под № ' + IntToStr(i+1));
Break;
end; //if
end; //for
//закрываем файл:
f.Free;
end;
Здесь код достаточно прозрачен, однако еще раз обращаю ваше внимание на то, что индексы строк начинаются с нуля, а свойство Count возвращает общее количество строк. То есть, если в тексте лишь 2 строки и Count вернет цифру 2, то индексы этих строк будут 0 и 1, поэтому в цикле мы использовали диапазон от 0 до Count-1, иначе бы произошла ошибка переполнения цикла.
Итак, кроме того, что мы уже рассмотрели, этот объект имеет и другие, известные вам по Memo методы:
- Add – добавить новую строку в конец:
· f.Add('Новая строка');
- Clear – очистить объект (не будет текста):
· f.Clear;
- Insert – вставить строку. Есть 2 параметра – индекс вставляемой строки, и сама строка:
· f.Insert(3, 'Новая 4-я строка, следующие строки сдвинутся вниз');
- Delete – удалить строку. Есть параметр – индекс удаляемой строки.
· f.Delete(f.Count-1); //удалили последнюю строку