Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

F.Seek(10, soFromBeginning);



Метод Seek всегда возвращает смещение курсора от начала файла. Этим можно воспользоваться чтобы узнать где мы сейчас находимся, а можно и узнать общий размер файла. Если переместится в конец файла, то функция вернёт нам количество байт от начала до конца, т.е. полный размер файла.

В следующем примере я устанавливаю позицию в файле на 0 байт от конца файла, т.е. в самый конец. Тем самым я получаю полный размер файла:

Размер файла:= f.Seek(0, soFromEnd);

Для чтения из файла нужно использовать метод Read.. И снова у этого метода два параметра:

1. 1. Переменная, в которую будет записан результат чтения.

2. 2. Количество байт, которые надо прочитать.
Давай взглянём на код чтения из файла, начиная с 15 позиции в файле.

Var

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

buf: array[0..10] of char; // Буфер, для хранения прочитанных данных begin // В следующей строчке я открываю файл filename.txt для чтения и записи.

f:= TFileStream.Create(‘c:\filename.txt’, fmOpenReadWrite);

f.Seek(15, soFromCurrent); // Перемещаюсь на 15 символов вперёд. f.Read(buf, 10); // Читаю 10 символов из установленной позиции. f.Free; // Уничтожаю объект и соответственно закрываю файл.

End;

Заметь, что в методе Seek я двигаюсь на 15 символов не от начала, а от текущей позиции, хотя мне нужно от начала. Это потому что после открытия файла текущая позиция и есть начало.

Метод Read возвращает количество реально прочитанных байт (символов). Если не произошло никаких проблем, то это число должно быть равно количеству запрошенных для чтения байт. Есть только два случая, когда эти числа отличаются:

1. 1. При чтении был достигнут конец файла и дальнейшее чтение стало не возможным.

2. 2. Ошибка на диске или любая другая физическая проблема.

Осталось только разобраться с методом для записи. Для записи мы будем использовать Write. У него так же два параметра.

1. 1. Переменная, содержимое которой нужно записать.

2. 2. Число байт для записи.
Пользоваться этим методом можно точно также как и методом для чтения.
Напоследок одно замечание: после чтения или записи текущая позиция в файле

смещается на количество прочитанных байт. То есть текущая позиция становится в конец прочитанного блока данных.

Примера пока не будет, потому что в принципе и так всё ясно. А если есть вопросы, то на практике мы закрепим этот материал буквально через один или два раздела, когда будем работать с структурами.

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

предыдущей части я показал общий случай работы с файлами. В этой части мы познакомимся с частным случаем – текстовые файлы. В них информация расположена не сплошным одинарным блоком, а в виде строк текста. Было

бы удобно воспринимать такие файлы в виде наборов строк.

Если мы попытаемся прочитать текстовый файл методами, описанными в прошлой части, то работать с текстом будет неудобно. Допустим, что у нас есть файл из двух строчек:

Привет!!!

Как жизнь?

Если прочитать его с помощью объекта TFileStream, то мы увидим весь текст в одну строку:

Привет!!! <CR><LF> Как жизнь?

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

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

Рис 1Иерархия объекта TStringList

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

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

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

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

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

End;

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

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

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

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

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

End;

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

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

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

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

begin f:= TStringList.Create(); f.LoadFromFile(‘c:\filename.txt’);// Загружаю текстовый файл f.Strings[0]; // Здесь находиться первая строчка файла f.Strings[1]; // Здесь находиться вторая строчка файла





Дата публикования: 2014-11-04; Прочитано: 646 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...