Найти номер элемента с заданным значением (все элементы разные).

Не отсортированный массивconst m=10;type mass = array [1..m] of integer;procedure poisk (x:mass; n,p:integer; var k:integer);var i : integer;begini := 1; k := 0;while i <= n do if x[i]=p then begin k := i; i := n+1 end else i := i + 1end;

Отсортированный массив

алг ДИХ(цел N, целтаб X[1:N], цел P,K)
арг X, N, P
рез K
начцел A, B, C
A := 1; B := N
пока A<B
нц C := INT((A+B)/2)
если X[С]<P
то A := C+1
иначе B := C
все
кц
если
X[A]=P
то K := A
иначе K := 0
все
кон

Запись в файл текстовой информации

Memo1.Lines.SaveToFile(Имя_файла); // сохранение

или

Рассмотрим пример:

procedure TForm1.Button1Click(Sender: TObject);

Var f:TextFile; // указатель на текстовый файл

begin

AssignFile(f,'c:\1.txt'); // привязка названия к переменной

{$I-}

Append(f); // открыть файл для добавления

if IOResult<>0 then // если ошибка открытия (напр. файла нет)

Begin

{$I-}

Rewrite(f); // создать новый файл

{$I+}

if IOResult<>0 then // ошибка создания файла

Begin

ShowMessage('Ошибка создания файла C:\1.TXT');

Exit;

end;

end;

WriteLn(f,'Привет'); // запись в файл строки с символами перевода строки

CloseFile(f); // закрыть файл

end;

Процедура Append(Файл) открывает файл для записи и устанавливает указатель записи в конец файла, т.е. все добавляемые к файлу строки будут записаны в конец файла.

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

Поиск созданных файлов

Поиск файлов в Delphi поможет найти файлы, подходящие по выбранным программистом критериям - имени, размеру, дате создания и т.д. Поиск файлов может производиться как по всему выбранному диску, так и ограничиться отдельным каталогом. Поиск файлов в Delphi выполняется в три этапа.

  1. Сначала находится первый файл, удовлетворяющий заданной маске. Этот поиск осуществляется с помощью функции
    function FindFirst(const Path: String; Attr: Integer; var F: TSearchRec): Integer;

    Параметр Path задаёт адрес каталога (директории), в котором производится поиск. Он должен завершаться маской имён искомых файлов, например:
    'C:\Temp\*.*', '*.txt'.
    Символ '*' означает любое количество допустимых в имени файла символов. Если необходимо указать, что символ должен быть только один, то в маске используется символ '?'. Например, маска a*.txt определяет текстовые файлы с именем любой длины начинающиеся на a, а маска a?.txt ограничивает длину имени файлов двумя символами. Если в маске описан только файл, то поиск осуществляется только в текущем каталоге.

    Параметр Attr содержит набор атрибутов, которые могут учитываться при отборе файлов:
    • faReadOnly = $01 - файл только для чтения;
    • faHidden = $02 - скрытый файл;
    • faSysFile = $04 - системный файл;
    • faVolumeID = $08 - метка диска;
    • faDirectory = $10 - каталог (директория);
    • faArchive = $20 - архивный файл;
    • faAnyFile = $3F - произвольный файл.


Эти атрибуты имеют значение отдельных битов в результирующем числе Attr. Для задания искомому файлу набора атрибутов их нужно просто просуммировать:
Attr := faReadOnly + faSysFile + faHidden;
Такой набор атрибутов заставит функцию искать только скрытые системные файлы с характеристикой "только для чтения".

Результат поиска содержится в переменной F, имеющей тип TSearchRec:
type TSearchRec = record
Time: Integer;
Size: Integer;
Attr: Integer;
Name: TFileName;
ExcludeAttr: Integer;
FindHandle: THandle;
FindData: TWin32FindData;
end;

Наиболее важными среди полей этой записи являются:

    • Name - имя файла;
    • Size - Размер файла в байтах;
    • Time - время создания файла в формате DOS.


Чтобы определить, имеет ли найденный файл нужный атрибут, используется поразрядное логическое умножение:
if (F.Attr and faDyrectory)=F.Attr
then S:='Это каталог';
То есть, имеющая нужный атрибут переменная F.Attr при поразрядном логическом умножении на него не изменяется.

  1. Когда первый файл, удовлетворяющий условиям поиска, найден, вызывается функция
    function FindNext(var F: TSearchRec): Integer;

    Переменная F, в которой первая функция сохранила результат поиска, передаётся функции FindNext в качестве параметра. На основании записанной в неё информации будет продолжен поиск следующего подходящего файла.
  2. Процесс поиска завершается вызовом процедуры:
    procedure FindClose(var F: TSearchRec);

    Эта процедура освобождает память, которая была выделена системой для проведения процесса поиска.


Функции FindFirst и FindNext возвращают значение 0, если при поиске не возникло ошибок и очередной файл был найден.

Чтение из текстового файла

На прошлых уроках мы как, в компоненте Memo процесс загрузки и записи текстового файла делался следующим образом:

Memo1.Lines.LoadFromFile(Имя_файла); // загрузка

Memo1.Lines.SaveToFile(Имя_файла); // сохранение

Все это благодаря свойству Lines, в котором хранятся строки.

Но на практике иногда необходимо прочитать только определенную строку или совершить операцию добавления строки в уже существующий файл.

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

procedureTForm1.Button1Click(Sender: TObject);

Varf:TextFile; // объявление файловой переменной

st:String; // строковая переменная

begin

AssignFile(f,'c:\1.txt'); // привязка названия файла к файловой переменной

{$I-} // отключение контроля ошибок ввода-вывода

Reset(f); // открытие файла для чтения

{$I+} // включение контроля ошибок ввода-вывода

ifIOResult<>0 then // если есть ошибка открытия, то

Begin

ShowMessage('Ошибка открытия файла C:\1.TXT');

Exit; // выход из процедуры при ошибке открытия файла

end;

While not EOF(f) do // пока не конец файла делать цикл:

Begin

ReadLn(f,st); // читать из файла строку

ShowMessage(st); // выводить строку пользователю

end;

CloseFile(f); // закрыть файл

end;

Прокомментирую некоторые строки этого примера.

Команда AssignFile осуществляет привязку строки пути файла к файловой переменной. Все дальнейшие операции с файловой переменной автоматически осуществляются с указанным файлом. Для избежания путаниц, указывайте полный путь к файлу.

{$I-} и {$I+} являются директивами компилятору, что в этом месту соответственно следует отключить и включить контроль ошибок ввода-вывода. В данном случае при неудачной попытке открытия файла c:\1.txt (файл отсутствует или открыт для записи другой программой) наша программа не выдаст аварийной ошибки и продолжит выполнение данной процедуры. Это свойство полезно для обработки всех возможных случаев в работе программы.

IOResult – переменная, которая хранит в себе код ошибки последней операции ввода-вывода. Если она равна нулю, то последняя операция была успешно выполнена.

EOF(Файл) – функция, возвращающая признак конца файла. Т.е. она показывает, достигнут или нет конец открытого файла.

ReadLn(Файл,Переменная) – процедура считывания переменной из файла. В отличие от команды Read производит считывание строки с завершающимся символом перевода строки под кодами 13 и 10 (клавиша Enter).

CloseFile(Файл) – процедура закрытия ранее открытого файла.

Наши рекомендации