![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите решить задачку:) [D6, Win2k]
pathfinder © (2005-10-25 20:41:00)Суть такая:
есть файл вида
фамилия^имя^отчество^и т.д.
...
...
необходимо фамилию писать в переменную S_FAM, имя в S_NAM, отчество в S_SUR. Первое делаю так:
var
St:TStringList;
i:integer;
S, S_FAM, S_NAM, S_SUR: string;
begin
St:=TStringList.Create;
S_F:=' ';
if opendialog1.Execute then St.LoadFromFile(opendialog1.FileName);
for y:=0 to St.Count-1 do
begin
S:=St.Strings[y];
for i:=1 to Pos('^', S)-1 do
S_FAM[i]:=S[i]; <---
end;
end;
а вот как дальше непонятно:(
и еще, если не заполнить S_FAM пробелами, то в месте <--- возникает ошибка:(
Заранее спасибо.
GanibalLector (2005-10-25 22:22:00) [1]А как быть Мехтиеву Мерзе Мехти Огли??? Я серьезно.
pathfinder (2005-10-25 21:27:00) [2]СПАСИБО ВСЕМ ОГРОМНОЕ! Вы мне очень помогли.
SamProf (2005-10-25 21:15:00) [3]var
St:TStringList;
S:string;
i:integer;
S, S_FAM, S_NAM, S_SUR: string;
begin
St:=TStringList.Create;
S_F:=' ';
if opendialog1.Execute then St.LoadFromFile(opendialog1.FileName);
for y:=0 to St.Count-1 do
begin
S:=St.Strings[y];
s_fam:=copy(s,1,pos('^',s)-1);
delete(s,1,pos('^',s));
s_nam:=copy(s,1,pos('^',s)-1);
delete(s,1,pos('^',s));
s_sur:=copy(s,1,pos('^',s)-1);
delete(s,1,pos('^',s));
..........................................
end;
end;
А ошибка выскакивает, потомучто ты пишеш i-й символ в сроку с нулевым размером!
SamProf (2005-10-25 21:13:00) [4]var
St:TStringList;
S:string;
i:integer;
S, S_FAM, S_NAM, S_SUR: string;
begin
St:=TStringList.Create;
S_F:=' ';
if opendialog1.Execute then St.LoadFromFile(opendialog1.FileName);
for y:=0 to St.Count-1 do
begin
S:=St.Strings[y];
s_fam:=copy(s,1,pos('^',s)-1);
delete(s,1,pos('^',s));
s_nam:=copy(s,1,pos('^',s)-1);
delete(s,1,pos('^',s));
s_sur:=copy(s,1,pos('^',s)-1);
delete(s,1,pos('^',s));
..........................................
end;
end;
А ошибка выскакивает, потомучто ты пишеш i-й символ в сроку с нулевым размером!
palva (2005-10-25 21:11:00) [5]
{$APPTYPE CONSOLE}
uses StrUtils;
var
S, S_FAM, S_NAM, S_SUR: string;
pb, pe: Integer;
begin
S := 'Пушкин^Александр^Сергеевич^';
pb := 0;
pe := PosEx('^', S, pb + 1);
S_FAM := Copy(S, pb + 1, pe - pb - 1);
pb := pe;
pe := PosEx('^', S, pb + 1);
S_NAM := Copy(S, pb + 1, pe - pb - 1);
pb := pe;
pe := PosEx('^', S, pb + 1);
S_SUR := Copy(S, pb + 1, pe - pb - 1);
pb := pe;
// и т. д.
WriteLn(S_FAM); // Пушкин
WriteLn(S_NAM); // Александр
WriteLn(S_SUR); // Сергеевич
end.
YurikGL (2005-10-25 21:07:00) [6]
> есть файл вида
> фамилия^имя^отчество^и т.д.
Если файл именно такого вида, то откуда в нем переводы строки? Я это к тому, что если это именно так, чтоfor y:=0 to St.Count-1 doне нужно
Далее алгоритм может быть примерно такой:
k:=1
символы с k+1 по Pos('^', S)-1 из подстроки от k+1 до конца копируем в фамилию
k:=Pos('^', S)
символы с k+1 по Pos('^', S)-1 из подстроки от k+1 до конца копируем в имя
k:=Pos('^', S)символы с k+1 по Pos('^', S)-1 из подстроки от k+1 до конца копируем в отчество
k:=Pos('^', S)
и так далее, пока строка не кончится...
Virgo_Style (2005-10-25 21:06:00) [7]Имеет смысл написать функцию
function GetTextBeforeDelimiter(var S:String;Delimiter:String='^'):String;
var p:integer;
begin
p:=Pos(Delimiter,S);
if p=0 then p:=Length(S)+1;
Result:=Copy(S,1,p-1);
Delete(S,1,p); //немного некрасиво при p=Length(S)+1
end;
Не проверял.
pathfinder (2005-10-25 20:52:00) [8]
Zeqfreed ©
F7..
в этом месте вылезает ошибка "EAccessViolation.."
Zeqfreed (2005-10-25 20:44:00) [9]pathfinder (25.10.05 20:41)
> возникает ошибка:(
Как ты узнал?