Лекция 7 Строки ver 2.ppt
- Количество слайдов: 36
Символьный и строковый вид данных Лекция 6 Масюк В. М.
Символ это одна единица текста. Это буква, цифра, какой либо знак. Кодовая таблица символов состоит из 256 позиций, т. е. каждый символ имеет свой уникальный код от 0 до 255. Символ с некоторым кодом N записывают так: #N. Прямо так символы и указываются в коде программы. Так код символа представляет собой число не более 255, то очевидно, что в памяти символ занимает 1 байт. Просмотреть таблицу символов и их коды можно с помощью стандартной утилиты "Таблица символов", входящей в Windows (ярлык расположен в меню Пуск - Программы Стандартные - Служебные). Символ
Строка, она же текст это набор символов, любая их последовательность. Соответственно, один символ это тоже строка, тоже текст. Текстовая строка имеет определённую длину. Длина строки это количество символов, которые она содержит. Если один символ занимает 1 байт, то строка из N символов занимает соответственно N байт. Есть и другие кодовые таблицы, в которых 1 символ представлен не одним байтом, а двумя. Это Юникод (Unicode). В таблице Юникода есть символы всех языков мира. К сожалению, работа с Юникодом довольно затруднена и его поддержка пока что носит лишь локальный характер. Delphi не предоставляет возможностей для работы с Юникодом. Программная часть есть, но вот визуальные элементы формы, кнопки и т. д. не умеют работать с Юникод. Строки
array [0. . n] of char Формально, этот тип не являются строковыми. Однако, в delphi, он несколько отличаются от остальных типов массивов. А именно, если массив символов имеет нижнюю границу индекса равной 0, то delphi считает такой тип совместимым по присваиванию со строковыми константами. Например, если переменная a будет описана как a : array[0. . 20] of char, то оператор a : = 'abc' будет допустим. Причём, значения элементов начиная с a[3] и до a[20] будут установлены в #0.
pchar Этот тип широко используется в языках c и c++. В delphi, это не фундаментальный тип, а производный. Его определение выглядит так: pchar = ^char Т. е. переменные этого типа являются указателем, поэтому и имеют размер 4 байта. Формально, значение pchar может указывать как на один символ, так и на строку символов. Однако, общепринято что значения pchar указывают на строки, завершающиеся символом с кодом 0 (#0).
Не смотря на то, что формально pchar это указатель на char (^char), как это часто бывает в delphi, тип pchar имеет несколько особенностей по сравнению с другими указателями. Таких особенностей несколько. Первая, заключается в том что константы, и глобальные переменные этого типа могут быть проинициализированы строковой константой. Вот пример: const pc : pchar ='abc'; var pv : pchar ='abc';
Вторая особенность в том, что к переменным типа pchar применимо обращение как к массиву символов: c : = pv^; // c будет присвоен символ 'a'. Это обычное обращение c : = pv[0]; // необычно, но С станет равным 'a' c : = pv[1]; // С станет равным 'b' c : = pv[2]; // С станет равным 'c' c : = pv[3]; // С станет равным #0 Третья особенность типа pchar в том, что к значениям этого типа применима так называемая адресная арифметика. Суть её в том, что значения pchar можно увеличивать, уменьшать, вычитать, и складывать. Для демонстрации использования этой особенности, приведём пример реализации функции подсчитывающей длину строки, указатель на которую передается в качестве параметра. function stringlength (p : pchar) : cardinal; begin result : = 0; if p = nil then exit; while p^ <> #0 do begin inc(result); inc(p); end;
ansistring и widestring Строки этого типа объединили в себе ряд качеств как строк shortstring и их байтом длины, так и строк завершающихся нулем (pchar). Такой формат строк хоть и более трудоемок в обработке, зато в принципе лишен ограниченности на максимальный размер строки. Реализация В таблице характеристик строковых типов, размер переменных ansistring равен четырем байтам, как и у pchar. Это говорит нам о том, что переменные этого типа тоже являются указателями. Но, в отличие от pchar, в данном случае, это скрыто реализацией. В частности, если например выполнить следующий код: var s 1, s 2 : ansistring; . . . s 1 : = 'abc'; s 2 : = s 1; то в памяти будет храниться лишь ОДИН экземпляр строки 'abc'!
Преобразование строк из одного типа в другой Здесь, все как обычно, и просто и сложно. Преобразование между "настоящими" строковыми типами string[n], shortstring, и ansistring выполняются легко, и прозрачно. Никаких явных действий делать не надо, delphi все сделает за Вас. Надо лишь понимать, что в «маленькое» «большое» не влезает. Например: var s 3 : string[3]; s : ansistring; . . . s : = 'abcdef'; s 3 : = s; В результате выполнения этого кода, в переменной s 3 окажется строка 'abc', а не 'abcdef'. http: //articles. org. ru/cfaq/index. php? qid=2139
Запись и чтение из файла var f : file; str : ansistring; len : longint; . . . len : = length(str); blockwrite(f, len, sizeof(len)); // длинна строки blockwrite(f, pchar(str)^, length(str)); // сама строка Тогда, можно будет прочитать вот так: blockread(f, len, sizeof(len)); // длинна строки setlength(str, len); // выделение памяти под строку blockread(f, pchar(str)^, len); // чтение строки Что, сложно? Ну, за возможность хранить строки длинной >255 символов приходится платить. Если же достаточно и 255 символов, то используйте shortstring, или string[n]. Есть еще одно, на мой взгляд, замечание. Если Вы обратили внимание на тип переменной len в моем примере, то возможно у Вас возник вопрос: А почему longint, а не integer?
Стандартные функции обработки строк: 1) Функция Length(Str: String) возвращает длину строки (количество символов). Пример: var Str: String; L: Integer; {. . . } Str: ='Hello!'; L: =Length(Str); { L = 6 } 2) Функция Set. Length(Str: String; New. Length: Integer) позволяет изменить длину строки. Если строка содержала большее количество символов, чем задано в функции, то "лишние" символы обрезаются. Пример: var Str: String; {. . . } Str: ='Hello, world!'; Set. Length(Str, 5); { Str = "Hello" }
3) Функция Pos(Sub. Str, Str: String) возвращает позицию подстроки в строке. Нумерация символов начинается с единицы (1). В случае отсутствия подстроки в строке возращается 0. Пример: var Str 1, Str 2: String; P: Integer; {. . . } Str 1: ='Hi! How do you do? '; Str 2: ='do'; P: =Pos(Str 2, Str 1); { P = 9 } 4) Функция Copy(Str: String; Start, Length: Integer) возвращает часть строки Str, начиная с символа Start длиной Length. Ограничений на Length нет если оно превышает количество символов от Start до конца строки, то строка будет скопирована до конца. Пример: var Str 1, Str 2: String; {. . . } Str 1: ='This is a test for Copy() function. '; Str 2: =Copy(Str 1, 11, 4); { Str 2 = "test" } 5) Процедура Delete(Str: String; Start, Length: Integer) удаляет из строки Str символы, начиная с позиции Start длиной Length. Пример: var Str 1: String; {. . . } Str 1: ='Hello, world!'; Delete(Str 1, 6, 7); { Str 1 = "Hello!" }
6) Процедура Insert(Sub. Str: String; Pos: Integer) вставляет в строку Str подстроку Sub. Str в позицию Pos. Пример: var Str: String; {. . . } Str: ='Hello, world!'; Insert('my ', Str, 8); { Str 1 = "Hello, my world!" } 7) Функции Upper. Case(Str: String) и Lower. Case(Str: String) преобразуют строку соответственно в верхний и нижний регистры: var Str 1, Str 2, Str 3: String; {. . . } Str 1: ='h. ELLo'; Str 2: =Upper. Case(Str 1); { Str 2 = "HELLO" } Str 3: =Lower. Case(Str 1); { Str 3 = "hello" } Строки можно сравнивать друг с другом стандартным способом: var Str 1, Str 2, Str 3: String; B 1, B 2: Boolean; {. . . } Str 1: ='123'; Str 2: ='456'; Str 3: ='123'; B 1: =(Str 1 = Str 2); { B 1 = False } B 2: =(Str 1 = Str 3); { B 2 = True } Если строки полностью идентичны, логическое выражение станет равным True.
В модуле Str. Utils. pas содержатся полезные функции для обработки строковых переменных. Чтобы подключить этот модуль к программе, нужно добавить его имя (Str. Utils) в раздел Uses. 1) Pos. Ex(Sub. Str, Str: String; Offset: Integer) функция аналогична функции Pos(), но позволяет задать отступ от начала строки для поиска. Если значение Offset задано (оно не является обязательным), то поиск начинается с символа Offset в строке. Если Offset больше длины строки Str, то функция возратит 0. Также 0 возвращается, если подстрока не найдена в строке. Пример: uses Str. Utils; {. . . } var Str 1, Str 2: String; P 1, P 2: Integer; {. . . } Str 1: ='Hello! How do you do? '; Str 2: ='do'; P 1: =Pos. Ex(Str 2, Str 1, 1); { P 1 = 12 } P 2: =Pos. Ex(Str 2, Str 1, 15); { P 2 = 19 } 2) Функция Ansi. Replace. Str(Str, From. Text, To. Text: String) производит замену выражения From. Text на выражение To. Text в строке Str. Поиск осуществляется с учётом регистра символов. Следует учитывать, что функция НЕ изменяет самой строки Str, а только возвращает строку с произведёнными заменами. Пример: uses Str. Utils; {. . . } var Str 1, Str 2, Str 3, Str 4: String; {. . . } Str 1: ='ABCabc. Aa. Bb. Cc'; Str 2: ='abc'; Str 3: ='123'; Str 4: =Ansi. Replace. Str(Str 1, Str 2, Str 3); { Str 4 = "ABC 123 Aa. Bb. Cc" } Дополнительные функции обработки строк
3) Функция Ansi. Replace. Text(Str, From. Text, To. Text: String) выполняет то же самое действие, что и Ansi. Replace. Str(), но с одним исключением замена производится без учёта регистра. Пример: uses Str. Utils; {. . . } var Str 1, Str 2, Str 3, Str 4: String; {. . . } Str 1: ='ABCabc. Aa. Bb. Cc'; Str 2: ='abc'; Str 3: ='123'; Str 4: =Ansi. Replace. Text(Str 1, Str 2, Str 3); { Str 4 = "123123 Aa. Bb. Cc" } 4) Функции Reverse. String(Str: String) и Ansi. Reverse. String(Str: Ansi. String) инвертируют строку, т. е. располагают её символы в обратном порядке. Пример: uses Str. Utils; {. . . } var Str 1: String; {. . . } Str 1: ='0123456789'; Str 1: =Reverse. String(Str 1); { Str 1 = "9876543210" } 5) Функция If. Then(Value: Boolean; ATrue, AFalse: String) возвращает строку ATrue, если Value = True и строку AFalse если Value = False. Параметр AFalse является необязательным в случае его отсутствия возвращается пустая строка. uses Str. Utils; {. . . } var Str 1, Str 2: String; {. . . } Str 1: =If. Then(True, 'Yes'); { Str 1 = "Yes" } Str 2: =If. Then(False, 'Yes', 'No'); { Str 2 = "No" }
Технология работы с файлами в системе Delphi требует определённого порядка действий: Прежде всего файл должен быть открыт. Система следит, чтобы другие приложения не мешали работе с файлом. При этом определяется, в каком режиме открывается файл для изменения или только считывания информации. После открытия файла в программу возвращается его идентификатор, который будет использоваться для указания на этот файл во всех процедурах обработки. Начинается работа с файлом. Это могут быть запись, считывание, поиск и другие операции. Файл закрывается. Теперь он опять доступен другим приложениям без ограничений. Закрытие файла гарантирует, что все внесённые изменения будут сохранены, так как для увеличения скорости работы изменения предварительно сохраняются в специальных буферах операционной системы. Работа с файлами
В Delphi реализовано несколько способов работы с файлами. Познакомимся со классическим способом, связанным с использованием файловых переменных. Файловая переменная вводится для указания на файл. Делается это с помощью ключевого слова File : var F: File ; Описанная таким образом файловая переменная считается нетипизированной, и позволяет работать с файлами с неизвестной структурой. Данные считываются и записываются побайтно блоками, размер которых указывается при открытии файла, вплоть от 1 байт. Но чаще используются файлы, состоящие из последовательности одинаковых записей. Для описания такого файла к предыдущему описанию добавляется указание типа записи: var F: File of тип_записи ; В качестве типа могут использоваться базовае типы, или создаваться свои. Важно только, чтобы для типа был точно известен фиксированный размер в байтах, поэтому, например, тип String в чистом виде применяться не может, а только в виде String[N]
Данные, считанные из файла или записываемые в файл, содержатся в обычной переменной, которая должна быть того же типа, что и файловая. Поэтому сначала в программе лично я описываю нужный тип, а затем ввожу две переменные этого типа файловую и обычную:
Для открытия файла нужно указать, где он расположен. Для этого файловая переменная должна быть ассоциирована с нужным файлом, который определяется его адресом. Адрес файла может быть абсолютным, с указанием диска и каталогов ('C: Мои документыFile. Name. ini'), или относительным, тогда он создаётся в папке с. exe файлом программы. Делается это оператором Assign. File : Assign. File(Save. F, 'C: Мои рисункиFile. Name. ini'); Assign. File(Save. F, 'File. Name. ini'); Теперь файл должен быть открыт. Открытие файла оператором Rewrite приведёт воссозданию файла заново, т. е. существующий файл будет без предупреждения уничтожен, и на его месте будет создан новый пустой файл заданного типа, готовый к записи данных. Если же файла не было, то он будет создан. Открытие файла оператором Reset откроет существующий файл к считыванию или записи данных, и его указатель будет установлен на начало файла : Rewrite(Save. F); Reset(Save. F);
Каждый из этих операторов может иметь второй необязательный параметр, имеющий смысл для нетипизированных файлов, и указывающий длину записи нетипизированного файла в байтах: Rewrite(Save. F, 1); Reset(Save. F, 1); Чтение файла производится оператором Read : Read(Save. F, Save. V); Запись в файл производится оператором Write : Write(Save. F, Save. V); При этом чтение и запись производится с текущей позиции указателя, затем указатель устанавливается на следующую запись. Можно проверить, существует ли нужный файл, оператором File. Exists : if File. Exists('File. Name. ini') then Read(Save. F, Save. V);
Принудительно установить указатель на нужную запись можно оператором Seek(Save. F, N), где N номер нужной записи, который, как и почти всё в программировании, отсчитывается от нуля: Seek(Save. F, 49); установка указателя на 50 ю запись. При последовательном чтении из файла рано или поздно будет достигнут конец файла, и при дальнейшем чтении произойдёт ошибка. Проверить, не достигнут ли конец файла, можно оператором EOF (аббревиатура End Of File), который равен true, если прочитана последняя запись и указатель находится в конце файла: while (not EOF(Save. F)) do Read(Save. F, Save. V);
Для текстовых файлов отдельно укажем, что тип файловой переменной в этом случае Text. File, а тип обычной String. Для текстовых файлов вместо Read и Write используются операторы Readln и Writeln, умеющие определять конец строки. «Классический» пример чтения из текстового файла и вывод данных в поле memo procedure TForm 1. Button 1 Click(Sender: TObject); var F: Text. File; V: String; begin with Open. Dialog 1 do if Execute then begin Assign. File(F, File. Name); Reset(F); while (not EOF(F)) do begin Readln(F, V); Memo 1. Lines. Add(V); end;
Оператор Truncate(Save. F) позволяет отсечь (стереть или, если хотите, удалить!) все записи файла, начиная от текущей позиции указателя, и до конца файла. В конце работы с файлом его необходимо закрыть. Это делается оператором Close. File(Save. F) ;
Запишем код программы, запоминающую своё положение на экране. Описание переменных опускаю, оно приведено на рисунке выше. Создаём обработчик события Формы On. Create со следующим содержимым: procedure TForm 1. Form. Create(Sender: TObject) ; begin Assign. File(Save. F, 'Init. ini') ; if File. Exists('Init. ini') then begin Reset(Save. F) ; Read(Save. F, Save. V) ; Form 1. Left : = Save. V. X ; Form 1. Top : = Save. V. Y ; Form 1. Caption: =Save. V. Caption ; //Наши переменные сохраняют заголовок end ; Теперь необходимо создать обработчик события On. Close : procedure TForm 1. Form. Close(Sender: TObject; var Action: TClose. Action) ; begin Rewrite(Save. F) ; //Нет необходимости проверять наличие, создадим его заново! Save. V. X : = Form 1. Left ; Save. V. Y : = Form 1. Top ; Save. V. Caption : = Form 1. Caption ; Write(Save. F, Save. V) ; Close. File(Save. F) ; end ; Пример.
Мы же хотим иметь возможность открывать любые файлы и работать с файлами по нашему выбору. Рассмотрим компоненты, позволяющие в работающей программе осуществлять выбор файлов. Delphi диалоги выбора файла позволяют указать программе, с каким файлом мы хотим работать. На вкладке палитры компонентов Dialogs находятся компонент Delphi Open. Dialog и компонент Delphi Save. Dialog. Все Delphi диалоги, находящиеся на этой вкладке, в том числе и Delphi диалоги выбора файла, невизуальные, они видны только на этапе конструирования. Компонент Delphi Open. Dialog позволяет открыть в нашей программе стандартное Windows окно диалога открытия файла, компонент Delphi Save. Dialog окно диалога сохранения. Визуальные компоненты работы с файлами
Delphi диалоги выбора файла сами по себе ничего не делают, а только предоставляют настройки, сделанные пользователем при выборе файла. Самый важный метод Delphi диалогов Execute. Он срабатывает в момент нажатия кнопки "открыть" или "сохранить" в окне выбора файла. Для примера давайте введём в программу возможность выбора файла для загрузки в редактор Memo, и сохранения после редактирования. Итак, выносим на Форму оба Delphi диалога, текстовый редактор Memo, и три кнопки Button. В свойство Caption одной из них записываем "Открыть. . . ", другой "Сохранить", третьей "Сохранить как. . . "
В обработчике On. Click кнопки "Открыть. . . " пишем: if Open. Dialog 1. Execute then Memo 1. Lines. Load. From. File(Open. Dialog 1. File. Name); В результате выбора файла свойство File. Name компонента Open. Dialog получает значение полного адреса выбранного файла, который мы и вставляем в функцию загрузки файла компонента Memo. Или, используя оператор присоединения with Open. Dialog 1, Memo 1 do if Execute then Lines. Load. From. File(File. Name);
Так как свойства компонентов Open. Dialog и Save. Dialog одинаковы, сохранение текста выглядит абсолютно аналогично. Создаём обработчик нажатия кнопки "Сохранить как. . . " и пишем: with Save. Dialog 1, Memo 1 do if Execute then begin Lines. Save. To. File(File. Name); Open. Dialog 1. File. Name: =File. Name; // Чтобы исправленный текст не затёр источник end; Наконец, для кнопки "Сохранить" пишем: Memo 1. Lines. Save. To. File(Open. Dialog 1. File. Name); // Сохраняем туда, откуда считали *Свойство Delphi диалогов Title позволяет записать в заголовок нужную нам фразу. Если оставить его пустым, то в заголовке будут стандартные "открыть" или "сохранить" Свойство Initial. Dir позволяет в момент открытия оказаться в нужной нам директории. Оно доступно как на этапе "конструирования", так и программно.
Сколько байтов в него поместится, таков и его размер. План такой: Задаём тип данных размером 1 байт. Это будет запись. Определяем файловую переменную этого типа. Начинаем с начала файла и переходим к концу. Сколько переходов столько и байтов в файле! Программа будет состоять из Формы, на которую бросим компонент выбора файла Open. Dialog и кнопку Button, по нажатию на которую и будем выбирать файл. Вот, собственно, и обработчик этой кнопки: procedure TForm 1. Button. Click(Sender: TObject); type TSize = Record Bait: byte; end; var F: File of TSize; Size: Integer; begin Size: =0; with Open. Dialog 1 do if Execute then begin Assign. File(F, File. Name); Reset(F); while (not EOF(F)) do begin Size: =Size+1; seek(F, Size); end; Form 1. Caption: =Int. To. Str(Size); // Выводим информацию о размере в заголовок Формы Close. File(F); end; Пример 2. Длина файла
Для больших файлов ожидание затягивается, и программа выглядит "зависшей". Можно изменить программу так, чтобы она считала килобайты (заменить seek(F, Size) на seek(F, Size*1024)). Скорость работы возрастёт в 1024 раза. На самом деле всё гораздо проще! Размер файла возвращается встроенной функцией File. Size. А файл достаточно описать как имеющий тип byte: procedure TForm 1. Button. Click(Sender: TObject); var F: File of byte; Size: Integer; begin with Open. Dialog 1 do if Execute then begin Assign. File(F, File. Name); Reset(F); Size: =Filesize(F); Form 1. Caption: =Int. To. Str(Size); // Выводим информацию о размере в заголовок Формы Close. File(F); end; Длина. Вариант 2.
Функции работы с файлами Эта часть библиотеки претерпела изменения в Delphi. К функциям, которые работали с файлом через файловую переменную, добавились функции, рабо тающие с дескриптором файла. Они рассматривают файл как двоичный; с текстовыми файлами нужно работать "по старинке". Файловые функции, описанные в модуле SYSUTILS, приведены в таблице: function File 0 pen(const File. Name: string; Mode: Word) : Integer; Открывает существующий File. Name файл в режиме Mode (см. примеч. 1). Значение, возвра щаемое в случае успеха, — дескриптор открытого файла. В противном случае — код ошибки DOS. function File. Create(const Pile. Name: string): Integer; Создает файл с именем File. Name. Возвращает то же, что и File. Open. function File. Read(Handle: Integer; var Buffer; Count: Longint): Longint; Считывает из файла с дескриптором Handle Count байт в буфер Buffer. Возвращает число реально прочитанных байт или 1 при ошибке. function File. Write(Handle: Integer; const Buffer; Записывает в файл с дескриптором Handle Count байт из буфера Buffer. Возвращает число реально записанных байт или 1 при ошибке. function File. Seek(Handle: Integer; Offset: Longint; Origin: Integer): Longint; Позиционирует файл с дескриптором Handle в новое положение. При Origin = 1, 2, 3 положение смещается на Offset байт от начала файла, текущей позиции и конца файла соответственно. Возвращает новое положение или 1 при ошибке. procedure File. Close(Handle: Закрывает файл с дескриптором Handle. function File. Age(const Возвращает значения даты и времени создания файла или 1, если файл не существует. function File. Exists(const Возвращает True если файл File. Name существует к найден. function Find. First(const Path: string; Attr: Integer; var Search. Rec: TSearch. Rec): Integer; Ищет первый файл, удовлетворяющий маске поиска, заданной в Path и с атрибутами Attr (см. примеч. 2). В случае успеха заполняет запись Search. Rec (см. примеч. 3) и возвращает 0, иначе возвращает код ошибки DOS function Find. Next(var Search. Rec: TSearch. Rec): Integer; Продолжает процесс поиска файлов, удовлетворяющих маске поиска. Параметр Search. Rec должен быть заполнен при помощи Find. First. Возвращает 0, если очередной файл найден, или код ошибки DOS. Изменяет Search. Rec. procedure Find. Close(var Завершает процесс поиска файлов, удовлетворяющих маске поиска.
function File. Qet. Date(Handle: Integer) : Longint; Возвращает время создания файла с дескриптором Handle (в формате DOS) или 1, если дескриптор недействителен. procedure File. Set. Date(Handle: Integer; Устанавливает время создания файла с дескриптором Handle (в формате DOS). function File. Get. Attr(const File. Name: string): Integer; Возвращает атрибуты (см. примеч. 2) файла с именем File. Name или код ошибки DOS, если файл не найден. function File. Set. Attrtconst File. Name: string; Attr: Устанавливает атрибуты файла с именем File. Name. function Delete. File(const Уничтожает файл с именем File. Name и в случае успеха возвращает True. function Rename. File(const Old. Name, New. Name: string): Boolean; Переименовывает файл с именем Old. Name в New. Name и возвращает True в случае успеха. function Change. File. Ext(const File. Name, Extension: string): string; Изменяет расширение в имени файла File. Name на Extension и возвращает новое значение File. Name. Имя файла не изменяется. function Extract. File. Path(const File. Name: string): string; Извлекает из строки с полным именем файла File. Name часть, содержащую путь к нему. function Extract. File. Name(const File. Name: string): string; Извлекает из строки с полным именем файла File. Name часть, содержащую его имя и расширение. function Extract. File. Ext(const File. Name: string): string; Извлекает из строки с полным именем файла File. Name часть, содержащую его расширение.
function Expand. File. Name(const File. Name: string): string; Возвращает полное имя файла File. Name, добавляя при необходимости путь к нему и переводя все символы в верхний регистр. function File. Search(const Name, Dir. List: string): strings-Производит поиск файла с именем Name в группе каталогов, заданных параметром Dir. List. Имена каталогов должны отделяться друг от друга точкой с запятой. Возвращает в случае успеха полное имя файла или пустую строку, если файл не найден. function Disk. Free(Drive: Byte): Longint; Возвращает количество в байтах свободного места на заданном диске. Значение параметра Drive: 0 — для текущего диска, 1 — для А, 2 — для В и т. д. Если параметр неверен, функция возвращает 1. function Disk. Size(Drive: Byte): Longint; Возвращает размер диска Drive в байтах. Параметр Drive означает то же, что и в Disk. Free. function File. Date. To. Date. Time(File. Date: Longint): TDate. Time; Преобразует дату и время в формате DOS в принятый в Delphi формат TDate. Time. function Date. Time. To. File. Date(Date. Time: TDate. Time): Longint; Преобразует дату и время из формата TDate. Time в формат DOS.
procedure TForm 1. btn 1 Click(Sender: TObject); var f: file of Real; desc, Flength, i, pointer: Integer; z: Real; begin // стандартные средства // заполняем 10 случайными вещественными числами. Assign. File(f, 'E: real. dat'); Rewrite(f); Randomize; for i: =1 to 10 do begin z: =100. 12*random(12); write(f, z); end; Close. File(f);
// используем дескрипторы // забываем все ранее используемое // открываем файл на запись - fm. Open. Write. // Можно на обновление, чтение и др. desc: =fileopen('E: real. dat', fm. Open. Write); // находим длину файла - устанавливаем в коней указатель = 2 // = 0 - в начало, 1 - произвольно FLength : = File. Seek(desc, 0, 2); if desc>0 then // если дескриптор получен, то: begin pointer: =fileseek(desc, 40, 1); // на 40 й байт (5 число) ставим указатель. z: =12. 456; // зписываем в файл после 40 байта новое значение длиной 8 байт File. Write(desc, z, Size. Of(z)); // закрываем файл. File. Close(desc); end;


