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

Здесь <cr> — конец строки и <lf> — перевод каретки на новую строку. Таким образом, чтобы найти конец первой строки мы должны сканировать весь текст с целью поиска признака конца строки и перевода каретки (<cr> и <lf>). Это очень неудобно. А если у вас файл име­ет размер в 100 строк и вам нужно полу­чить доступ к 75-й строке? Как вы ду­маете, долго мы будем искать нужную строку? Нет, точнее сказать, что не дол­го, а неудобно.

 

Тут на помощь приходит объект TStrings, который является простым контейнером (хранилищем) для строк. Можно еще пользоваться более про­двинутым вариантом этого объекта TStringList. Если посмотреть на ие­рархию объекта TStringList (рис. 10.3), то мы увидим, что он происходит от TStrings. Это значит, что TStringList наследует себе все возможности объекта TStrings и добавляет в него новые.

Для работы с объектом надо объявлять переменную типа объект:

 

var

f:TStringList; //Переменная типа объект TStringList.

Hierarchy

TObject

I

TP ersi stent l

TStrings I

TStringList

 

Иерархия объекта TStringList (снимок из файла помощи Delphi):

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

Инициализируется эта переменная как всегда методом create. Никаких пара­метров не надо. Чтобы освободить память объекта и уничтожить его, применяется метод Free. Метод использования объекта показан в листинге: 

var

f:TStringList; //Переменная типа объект TStringList. begin

f:= TStringList.Create(); // здесь можно использовать класс f.Free; end;

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

 

Давайте снова ВСПОМНИМ, ЧТО TStringList происходит ОТ TStrings. Использо­вать TStrings напрямую нельзя, потому что это абстрактный объект. Абстрактный объект— объект, который представляет собой пустой шаблон. Он может даже ни­чего не уметь делать, а только описывать какой-то вид или шаблон, на основе ко­торого можно выводить полноценные объекты. Вот так TStringList добавляет в TStrings свои функции так, что он становится полноценным объектом.

 

В результате получается, что мы не можем объявлять переменные типа TStrings и использовать этот объект, потому что это всего лишь шаблон. Это и так и не так. Переменную мы можем объявлять, но использовать сам объект не можем. Зато мы можем объявить переменную типа TStrings, но использовать эту пере­менную как объект TStringList, потому что он происходит от первого. Это значит, что код, представленный в листинге 10.9, идентичен предыдущему. 

var

f:TStrings; //Переменная типа объект TStringList. begin

f:= TStringList.Create(); f.Free; end;

В этом примере мы объявили переменную типа TStrings, но при создании про- инициализировали ее объектом TStringList. Это вполне законная запись, потому что объект TStringList происходит от TStrings. Новая переменная f будет рабо­тать как объект TStringList, хотя и объявлена как TStrings. Главное— каким объектом переменная проинициализирована.

 

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

 

В разд. 7.6 мы уже познакомились с классом TStrings и его основными функ­циями, а сейчас оказывается, что это абстрактный класс и его нельзя создавать. Как же так получается? На самом деле, большинство компонентов используют именно TStringList. 

 

Итак, давайте рассмотрим, как можно работать с помощью TStringList, с целью обработки текстовых файлов. Все очень просто. У него есть метод LoadFromFile, для которого нужно указать имя текстового файла. После этого через свойство strings можно получить доступ к любой строке, а в свойстве count находится число, указы­вающее на количество строк в файле. В листинге 10.10 показан пример загрузки фай­ла и работа с первыми двумя строками. Обратите внимание, что строки нумеруются с нуля. 

var

f:TStrings; //Переменная типа объект TStringList. begin

f:= TStringList.Create();

f.LoadFromFile('с:\filename.txt');// Загрузка текстового файла f.Strings[0]; II Здесь находится первая строка файла f.Strings[1]; // Здесь находится вторая строка файла

f.Free; end;

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

var

f:TStrings; //Переменная типа объект TStringList. i: Integer; // Счетчик begin

f:= TStringList.Create();

f.LoadFromFile('c:\filename.txt'); // Загружаем текстовый файл

for i:=0 to f.Count-1 do // Запускаем цикл begin // Начало для цикла

if f.Strings = 'Привет, Вася1 then //Если i-я строка равна нужной, то

Application.MessageBox('Строка найдена', 'Поиск закончен', MB_OKCANCEL)

end; 11 Конец для цикла f.Free; end;

Точно так же можно изменять данные в файле. Например, если вам надо изме­нить 5-ю строку на "Прощай, станция Мир", то следует внести изменения, как по­казано в листинге: 

var

f:TStrings; //Переменная типа объект TStringList. i: Integer; // Счетчик begin

f:= TStringList.Create();

f.LoadFromFile(г с:\filename.txt'); II Загружаем текстовый файл

if f.Count>=5 then 11 Если в файле есть 5 строк, то изменить f.Strings[5] = 'Прощай, станция Мир';

f.Add('Прощай');// Добавляем новую строку

f.SaveToFile(*с:\filename.txt'); // Сохраняю результат f.Free; end;

 

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

 

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

 

На этом можно закончить рассмотрение. Помните, все, что мы говорили про TStrings ранее, В равной степени ОТНОСИТСЯ И К TStringList.

 

 

 

dle

Помоги проекту! Расскажи друзьям об этом сайте: