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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Чтение строк из файла до определённого символа

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

Volkogriz » 30 дек 2012, 06:05

Доброе время суток!
Не стал новую тему заводить решил что суть одна и та же!
Файл похож на ини но есть секции в которых у ключей нет свойств пример:

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

[HouseTypes]
Atreides
Ordos
Harkonnen
Ix
Tleilaxu
Fremen
Imperial
Guild
Incidental
Подскажите-помогите зачитать вот отсюда '[HouseTypes]' и остановится здесь '['.
С уважением,
Volkogriz!

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

Volkogriz » 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!

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

Сейчас_не_спящий » 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;
Хотя может и не работать, писал по памяти, не с дома

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

LAngel » 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]

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

BBB » 14 мар 2007, 09:20

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

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

Игорь Акопян » 14 мар 2007, 08:44

читаем из файла строку, ищем позицию символа "=", если она больше 0 (т.е. есть) сравниваем фрагмент прочитанной строки от начала до собсно символа "="
если наш ключ - читаем от Pos до конца строки - это значение

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

Сейчас_не_спящий » 13 мар 2007, 21:56

По хэлпу полазил, более-менее вроде разобрался, но всё же хочу разобраться через старый, добрый "Pos", да и так более привычно. Что разберусь это точно, вопрос только когда=)) В общем подскажите плиз как это делать через пос, у меня голова не догоняеет lefststr не катит :( .

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

BBB » 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;

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

Сейчас_не_спящий » 13 мар 2007, 15:40

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

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

BBB » 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]

Вернуться к началу