Чтение строк из файла до определённого символа
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
- Сейчас_не_спящий
- Сообщения: 46
- Зарегистрирован: 26 янв 2007, 17:06
- Откуда: Беларусь, Гомель
- Контактная информация:
Всем доброго времени суток.
Есть проблема:
есть файл 1.txt в нём записаны слова через символ "=" например:
abc=cba
awf=sr
adyrh=pk
.....и т.д.
что надо:
на форме лежат эдит, кнопка и лабел. Как сделать так чтобы, при вводе слова например "abc" делался поиск по файлу и выводилось значение которое стоит за символом "=". Выводилось например в "label1". Вводишь "abc" выдаёт "cba"?
По сути я нашёл очень схожую тему на одном форуме, но представленное там решение задачи у меня не работает, юзаю Дельфю7, может проблема не в коде? Хотя там ясно написано что на дэльфи делалось.
Вот линк на ту тему из форума: http://forum.sysadmins.ru/24/144094/?st ... highlight=
Есть проблема:
есть файл 1.txt в нём записаны слова через символ "=" например:
abc=cba
awf=sr
adyrh=pk
.....и т.д.
что надо:
на форме лежат эдит, кнопка и лабел. Как сделать так чтобы, при вводе слова например "abc" делался поиск по файлу и выводилось значение которое стоит за символом "=". Выводилось например в "label1". Вводишь "abc" выдаёт "cba"?
По сути я нашёл очень схожую тему на одном форуме, но представленное там решение задачи у меня не работает, юзаю Дельфю7, может проблема не в коде? Хотя там ясно написано что на дэльфи делалось.
Вот линк на ту тему из форума: http://forum.sysadmins.ru/24/144094/?st ... highlight=
Всё не знает никто, но важно найти того кто знает нужное...
Вообще (глядя на структуру файла) все очень похоже на чтение из INI-шки.
В WinAPI для чтения из INI есть функция GetPrivateProfileString:
Единственное, что в файле должна быть объявлена какая-нибудь INI-секция (раздел). То есть в самом верху должна быть строка, например:
[SYSTEM]
В 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
);
[SYSTEM]
- Сейчас_не_спящий
- Сообщения: 46
- Зарегистрирован: 26 янв 2007, 17:06
- Откуда: Беларусь, Гомель
- Контактная информация:
вообще это обыкновенный текстовый файл, хотя ничего не стоит его переименовать, Дэлфи будет его читать точно также как и тхт. а с чтинем из ини я не знаком, пример по этой теме выложить можешь?
Всё не знает никто, но важно найти того кто знает нужное...
Сейчас_не_спящий,
Переименовывать файл совершенно нет нужды. В функции указывается полное имя файла (включая расширениее)
Оказывается, в Delphi есть класс TIniFile (uses IniFiles)
Использовать, видимо, как-то так (пишу по help-у, в Дельфях не приходилось этого делать).
Или, если не использовать этот класс, то:
Переименовывать файл совершенно нет нужды. В функции указывается полное имя файла (включая расширениее)
Оказывается, в 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;
- Сейчас_не_спящий
- Сообщения: 46
- Зарегистрирован: 26 янв 2007, 17:06
- Откуда: Беларусь, Гомель
- Контактная информация:
По хэлпу полазил, более-менее вроде разобрался, но всё же хочу разобраться через старый, добрый "Pos", да и так более привычно. Что разберусь это точно, вопрос только когда=)) В общем подскажите плиз как это делать через пос, у меня голова не догоняеет lefststr не катит
.

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

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

у него есть параметр 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...
- Сейчас_не_спящий
- Сообщения: 46
- Зарегистрирован: 26 янв 2007, 17: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;
Всё не знает никто, но важно найти того кто знает нужное...
Код: Выделить всё
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!