动态数组…求助(55分)

  • 主题发起人 主题发起人 jamers
  • 开始时间 开始时间
J

jamers

Unregistered / Unconfirmed
GUEST, unregistred user!
如果有一个文本文件,其中长度未定,直接举个便子吧!
文本文件a.txt有以下内容:
A B C D E F
程序读取A.txt的内容,得出一个数组,test[6]
test[1]='A'
test[2]='B'
.
.
.
再举个例子A.txt有:
A B C
得到一个数组test[3]
test[1]='A'
test[2]='B'
test[3]='C'

文本文件中分隔可用不等量的空格或TAB,我只有这么多分了,请高手不吝赐教喔!
最好能有关键的一些代码,谢谢。[:)]
 
用TStringList.CommaText可以实现您的要求:
procedure TForm1.Button1Click(Sender: TObject);
var
a:String;
S:TStringList;
begin
a:='A B'#9#9#9#9'C';
S:=TStringList.Create;
S.CommaText:=a;
Caption:=S[2];
//S[0]:'A' S[1]:'B' S[2]:'C'
S.Free;
end;
 
setlength(arrayname,length );
 
那我如果要不限长度呢?
中间的空格也是未知,可以任意多个,只要没的换行,都要算在内,而且数组可能的项
也是不限,用什么语句可以更改数组大小?
 
再例
A.TXT
45556 jfjjfj XXC jfj
如何让程序返回数组test[4]
test[1]='45556'
test[2]='jfjjfj'
test[3]='XXC'
test[4]='jfj'
我要的关键就是通用性
 
procedure TForm1.Button1Click(Sender: TObject);
var
List: TStringList;
S, S1:string;
Loop:Integer;
begin
List:=TStringList.Create;
try
S1:='';
Memo1.Clear;
if OpenDialog1.Execute then
S:=OpenDialog1.FileName;
List.LoadFromFile(S);
S:=List.Text;
for Loop:=1 to Length(S) do
if S[Loop]<>' ' then
S1:=S1+S[Loop];
////添加对S1动态数组的处理
Memo1.Lines.Add('**********这是源文件************');
Memo1.Lines.Add('');
Memo1.Lines.AddStrings(List);
Memo1.Lines.Add('');
Memo1.Lines.Add('**********这是转化后的文件******');
Memo1.Lines.Add('');
Memo1.Lines.Add(S1);
finally
FreeAndNil(List);
end;
end;
 
同意先整理一下在写入数组中,
可以整理成规范的格式,不就解了!
 
以下代码调试通过:(uses 中要use StrUtils单元)
var t:array of string;
s,tmp:string;
i_Pos,i_Len:integer;
begin
while pos(' ',s)>0 do
begin
i_Pos:= pos(' ',s);
i_Len:=length(s);
tmp:=leftstr(s,i_Pos-1);
s:=trim(rightstr(s,i_Len-i_Pos));
if high(t)=-1 then
setlength(t,1)
else
setlength(t,high(t) + 2);
t[high(t)]:=tmp;
end;
if trim(s)<>'' then
begin
if high(t)=-1 then
setlength(t,1)
else
setlength(t,high(t) + 2);
t[high(t)]:=s;
end;
end;
 
好象这段代码只针对一个字符的,如果是我最后举的那个例子,好象就不适用了。
 
晕,,StrUtils在我的delphi里没有!
是不是就调用了leftstr和rightstr呀?
如果是这样的话,我自己编个小函数。
 
截取字段的部分可以這樣寫
function GetPosStr(V_Str,V_Delimiter:String;V_Seq:Integer):String;
var
V_StrH,V_StrA:String;
V_Count:Integer;
begin
if V_Seq=0 then
begin
Result:='';
end
else
begin
V_StrA:=V_Str;
for V_Count:=1 to V_Seq do
begin
if (ANSIPOS(V_Delimiter,V_StrA)=0) then
begin
V_StrH:=V_StrA;
V_StrA:='';
end
else
begin
V_StrH:=COPY(V_StrA,1,ANSIPOS(V_Delimiter,V_StrA)-1);
V_StrA:=COPY(V_StrA,ANSIPOS(V_Delimiter,V_StrA)+1,LENGTH(V_StrA)-ANSIPOS(V_Delimiter,V_StrA));
end
end;
Result:=V_StrH;
end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
s:TStrings;
i:integer;
begin
s:=TStringList.create;
s.LoadFromFile('D:/temp.txt');
//文件中间不要分行
s.commatext:=s[0];
for i:=0 to s.count-1 do
showmessage(s);
s.free;
end;
 
这是经过大家提点后,我编的程序,有谁可以将这些修改成一个函数吗?
我试了很久都没有成功耶!
求救啦……
代码:
var
  Temp:array of string;
  strstr,strRes,strTemp:string;
  i,number:integer;
begin
  label2.caption:='';
  //由控件内取字符串
  strstr:=edit1.text;
  strstr:=trim(strstr);
  number:=0;
  //去除所有的tab键,chr(9)
  for i:=1 to length(strstr) do
  begin
    strtemp:=copy(strstr,i,1);
    if strtemp=chr(9) then
 strtemp:=' ';
    strres:=strres+strtemp;
  end;
  strstr:=strres;
  setlength(temp,2);
  while pos(' ',strstr)<>0 do
    begin
      number:=number+1;
      i:=pos(' ',strstr);
      strres:=copy(strstr,1,i-1);
      setlength(temp,NUMBER+1);
      temp[high(temp)]:=strres;
      form1.Caption :=inttostr(high(temp));
      delete(strstr,1,i);
      strstr:=trim(strstr);
    end;
    number:=number+1;
    SETLENGTH(TEMP,number+1);
    TEMP[high(temp)]:=STRSTR;
    //以下语句为输入,较验
    FOR I:=1 TO number do
      label2.caption:=LABEL2.CAPTION + 'TEMP['+inttostr(i)+']='+TEMP[I]+#13#10;
  end;
 
我已经测试通过了…
希望有朋友能够帮我把它改编成一个函数…
呵,好象函数处理数组很麻烦吧?
 
你的程序执行一定巨慢,不能pos,我给你一段代码,把字符串提取后存到StringList里,
该怎么处理你自己办吧,存数组是没有问题的
procedure GetTagStr(ASrcStr:String;ADst:TStrings);
var Len,i:integer;
vs:String;
begin
ADst.Clear;
Len:=Length(ASrcStr);
vS:='';
For i:=1 to Len do
begin
if (ASrcStr=#9) or (ASrcStr=' ') then
begin
if vS<>'' then
begin
ADst.Append(vS);
vS:='';
end;
end else
vS:=vS+ASrcStr;
end;
if vS<>'' then
ADst.Append(vS);
end;
 
呵呵
我有一个比较好的方法,先发了再说,等会试试!
先把所有字符load进来
用stringlist的一个方法,就可以把结果放在stringlist的不同行了
类似于分析参数的代码!
delphi中是有代码的
 
sorry,错了是一个属性
memo1.lines.CommaText := '12 32 43';
看看什么结果吧
呵呵!
 
这是我修改后的程序,各位看看运行效率如何?
可能改成一个函数吗?请赐教
代码:
var temp:array of string;
    test,i:integer;
    str,str1,str2:string;
begin
  str:=label1.caption;
  setlength(temp,2);
  str:=trim(str);
  //清除tab chr(9)
  for i:=1 to length(str) do
    begin
      str2:=copy(str,i,1);
      if str2<>#9 then
 str1:=str1+str2 else
 str1:=str1+' ';
    end;
  str:=str1;
  test:=1;
  while length(str)>0 do
    begin
      str1:=copy(str,1,1);
      if (str1<>' ') then
        begin
          temp[test]:=temp[test]+str1;
          delete(str,1,1);
        end
      else
        begin
          str:=trim(str);
          test:=test+1;
          setlength(temp,test+1);
        end;
    end;
  //输出较验
  for i:=1 to test do
 label2.caption:=LABEL2.CAPTION + 'TEMP['+inttostr(i)+']='+TEMP[I]+#13#10;
end;
 
我还有个问题,怎么才能读取文件中的一行数据呢?
直接读取后,我想让这个程序使用
请帮忙啦
 
后退
顶部