Чтение строк из файла до определённого символа

Модераторы: Duncon, Naeel Maqsudov, Хыиуду, Игорь Акопян

Аватара пользователя
Сейчас_не_спящий
Сообщения: 45
Зарегистрирован: 26 янв 2007, 17:06
Откуда: Беларусь, Гомель
Контактная информация:

13 мар 2007, 11:05

Всем доброго времени суток.
Есть проблема:
есть файл 1.txt в нём записаны слова через символ "=" например:
abc=cba
awf=sr
adyrh=pk
.....и т.д.
что надо:
на форме лежат эдит, кнопка и лабел. Как сделать так чтобы, при вводе слова например "abc" делался поиск по файлу и выводилось значение которое стоит за символом "=". Выводилось например в "label1". Вводишь "abc" выдаёт "cba"?

По сути я нашёл очень схожую тему на одном форуме, но представленное там решение задачи у меня не работает, юзаю Дельфю7, может проблема не в коде? Хотя там ясно написано что на дэльфи делалось.
Вот линк на ту тему из форума: http://forum.sysadmins.ru/24/144094/?st ... highlight=
Всё не знает никто, но важно найти того кто знает нужное...
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

13 мар 2007, 15:05

Вообще (глядя на структуру файла) все очень похоже на чтение из INI-шки.
В WinAPI для чтения из INI есть функция GetPrivateProfileString:

Код: Выделить всё

DWORD GetPrivateProfileString(
  LPCTSTR lpAppName,        // section name
  LPCTSTR lpKeyName,        // key name
  LPCTSTR lpDefault,        // default string
  LPTSTR lpReturnedString,  // destination buffer
  DWORD nSize,              // size of destination buffer
  LPCTSTR lpFileName        // initialization file name
);
Единственное, что в файле должна быть объявлена какая-нибудь INI-секция (раздел). То есть в самом верху должна быть строка, например:

[SYSTEM]
Аватара пользователя
Сейчас_не_спящий
Сообщения: 45
Зарегистрирован: 26 янв 2007, 17:06
Откуда: Беларусь, Гомель
Контактная информация:

13 мар 2007, 15:40

вообще это обыкновенный текстовый файл, хотя ничего не стоит его переименовать, Дэлфи будет его читать точно также как и тхт. а с чтинем из ини я не знаком, пример по этой теме выложить можешь?
Всё не знает никто, но важно найти того кто знает нужное...
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

13 мар 2007, 17:52

Сейчас_не_спящий,
Переименовывать файл совершенно нет нужды. В функции указывается полное имя файла (включая расширениее)

Оказывается, в Delphi есть класс TIniFile (uses IniFiles)
Использовать, видимо, как-то так (пишу по help-у, в Дельфях не приходилось этого делать).

Код: Выделить всё

Var  vIni : TIniFile;
       st_adyrh :string;
begin
  vIni.Create ('C:\MyFlder\MyFile.TXT');

  st_adyrh := ReadString (
            'SYSTEM',  // раздел файла
            'adyrh',     // ключ, т.е. то, что слева от твоего '='
            'adyrh');   // значение по умолчанию, т.е. то, что вернет функция,
                           // если  ключ 'adyrh' в разделе  'SYSTEM' или вообще раздел
                           //  'SYSTEM' отсутсвуют
   vIni.Free ();
end;
Или, если не использовать этот класс, то:

Код: Выделить всё

var  Buffer: array[0..2047] of Char;
       stResult : String;
       Section, Ident, Default  : string
       FileName : string;
begin
  FileName := 'C:\MyFlder\MyFile.TXT';
  Section := 'SYSTEM';
  Ident := 'adyrh';
  Default := 'adyrh';

  SetString (stResult, 
                 Buffer,
         GetPrivateProfileString (PChar(Section),
                  PChar(Ident), PChar(Default), Buffer, SizeOf(Buffer),
                  PChar(FileName)));
end;
Аватара пользователя
Сейчас_не_спящий
Сообщения: 45
Зарегистрирован: 26 янв 2007, 17:06
Откуда: Беларусь, Гомель
Контактная информация:

13 мар 2007, 21:56

По хэлпу полазил, более-менее вроде разобрался, но всё же хочу разобраться через старый, добрый "Pos", да и так более привычно. Что разберусь это точно, вопрос только когда=)) В общем подскажите плиз как это делать через пос, у меня голова не догоняеет lefststr не катит :( .
Всё не знает никто, но важно найти того кто знает нужное...
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

14 мар 2007, 08:44

читаем из файла строку, ищем позицию символа "=", если она больше 0 (т.е. есть) сравниваем фрагмент прочитанной строки от начала до собсно символа "="
если наш ключ - читаем от Pos до конца строки - это значение
Изображение
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

14 мар 2007, 09:20

Игорь Акопян писал(а):читаем из файла строку, ищем позицию символа "=", если она больше 0 (т.е. есть) сравниваем фрагмент прочитанной строки от начала до собсно символа "="
если наш ключ - читаем от Pos до конца строки - это значение
Возможно, также стОит после нахождения '=' до сравнения отсечь лидирующие и хвостовые пробелы. Возможно, и у найденного значения (того, что после '=') тоже отсечь.
Но все это уже в зависимости от того, нужно или не нужно это по данному алгоритму.
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

14 мар 2007, 10:27

:) опять мой любимый TStringList
у него есть параметр Value, через который можно получить как раз что "стоит" после "=" в строке:

[syntax=delphi]var
Str: TStringList;
S: String;
begin
Str := TStringList.Create;
try
Str.LoadFromFile('FileName.ext');
S := InputBox('?', '', '');
ShowMessage(Str.Values[S]);
finally
Str.Free;
end;
end;[/syntax]
С уважением, Lost Angel...
Аватара пользователя
Сейчас_не_спящий
Сообщения: 45
Зарегистрирован: 26 янв 2007, 17:06
Откуда: Беларусь, Гомель
Контактная информация:

14 мар 2007, 23:06

У меня получилось добиться результата вот таким способом:

Код: Выделить всё

var
  f : TextFile;
  s, s1, s2 : string;
begin
  s1 := '...'; // тут например abc
  AssignFile(f, '1.txt');
  Reset(f);
  while not Eof(f) do
  begin
    readln(f, s);
    if Pos('...', s) > 0 then // вместо "..." символы после которых идёт поиск, вроде так
    begin
      s2 := Copy(trim(s),Length(s1),255);
      ComboBox1.Items.Add(trim(s2));
    end;
  end;
  closefile(f);
end;
Хотя может и не работать, писал по памяти, не с дома
Всё не знает никто, но важно найти того кто знает нужное...
Volkogriz
Сообщения: 4
Зарегистрирован: 30 дек 2012, 05:31

30 дек 2012, 05:42

Код: Выделить всё

function get_param(bg,ed:string;rep:string):string;//получение параметров
var i:integer;
begin
i:=pos(bg,rep);
if i<>0 then begin
             i:=i+length(bg)-1;
             delete(rep,1,i);
             get_param:=copy(rep,1,pos(ed,rep)-1);
             end
        else get_param:='';
end;

Используем:
function TForm1.load_LibImControl:бла бла бла; //так же делайте процедуру ниже указанный код можно вставить куда угодно!
var
ff:textfile;
s1,s2:string;
begin
assignfile(ff,extractfilepath(Application.ExeName)+'Installation.sis');
{$I-}
reset(ff);
{$I+}
if ioresult<>0 then
begin
                   exit;
                    end;
repeat
readln(ff,s1);
s2:=copy(s1,1,pos('=',s1)-1);
if s2='LibImControl' then 
например-edit.txt:= get_param('"','"',s1);
например-integer:= StrToInt(get_param('"','"',s1));
//вобщем разберётесь мне очень помогает эта функция! 
until eof(ff);
closefile(ff);
end;
С уважением,
Volkogriz!
Ответить