请教一个dephi问题,我有一个文本文档,想把里面的每行6个数据通过一定公式计算后的结果输出成一个新的文本文档,文档大小约为10M问题补充:输出文件每行为5个数据,源文本每行6个数据,格式为 
…… 
31: oL[1153]( x[/-62.8] y[/-8.3] z[/-10.3] u[/-0.66175835] v[/-0.57149924] w[/0.48524684] ) 
31: oL[1154]( x[/-62.7] y[/-8.6] z[/-10.1] u[/-0.66189173] v[/-0.57494751] w[/0.48097265] ) 
31: oL[1155]( x[/-62.6] y[/-8.9] z[/-10] u[/-0.66197151] v[/-0.57849393] w[/0.47659049] ) 
…… 
每一行读中括号里面的数据,把其中的x, y, z, u, v,w 赋给不同的变量,
这六个变量通过一些公式计算得出五个变量,比如H=x+y,I=u-z,J=v*w,K=x/y,L=w/z,
然后这五个变量输出的格式为 
……
GB H1.0 I40.824 J7.735 K.736 L35 
GB H2.12 I10.994 J17.335 K2.866 L66 
GB H10.50 I20.887 J71.643 K10.931 L2 
……
的文本
小数点精确到0.001
如果源文本中某一行缺少某一个变量的值则沿用先前行的值

解决方案 »

  1.   


    var 
      f:textfile;
      s:string;
      x,y,z,u,v,w,h,i,j,k:double;
    begin
      assigned(f,'文件名.txt');
      try
        reset(s);
        while not eof(f) do
        begin
          readln(f,s);
          .....        //解析s,然后给你需要的x,y,z,u,v,w 附值
           .....        //计算你的公式h=..,i=..,j=..,k=..
        end;
      finally
        closefile(f);
      end;
    end;
      

  2.   


    var
      f,f2:textfile;
      s,s2:string;
      strs:TStringList;
      x,y,z,u,v,w,h,i,j,k,L:double;
      i1:integer;
    begin
      assignfile(f,'c:\1.txt');
      assignfile(f2,'c:\2.txt');
      strs:=TStringList.Create;
      try
        reset(F);
        rewrite(f2);
        while not eof(f) do
        begin
          strs.Clear;
          readln(f,s);
          s:=Copy(s,Pos('](',s)+2,Length(s));
          ExtractStrings(['[','/',' ',']'],[],pChar(s),strs);
          for i1:=0 to (strs.Count div 2)-1 do
          begin
            if strs[i1*2]='x' then
                x:=StrToFloat(strs[i1*2+1])
            else if strs[i1*2]='y' then
                y:=StrToFloat(strs[i1*2+1])
            else if strs[i1*2]='z' then
                z:=StrToFloat(strs[i1*2+1])
            else if strs[i1*2]='u' then
                u:=StrToFloat(strs[i1*2+1])
            else if strs[i1*2]='v' then
                v:=StrToFloat(strs[i1*2+1]);
          end;
          H:=x+y;
          I:=u-z;
          J:=v*w;
          K:=x/y;
          L:=w/z;
          s2:=Format('GB H%.3f I%.3f J%.3f K%.3f L%.3f',[H,I,J,K,L]);
          writeln(f2,s2);
        end;
      finally
        closefile(f);
        closefile(f2);
      end;
    end;
      

  3.   


    uses StrUtils; //包含此单元const
      CharFlag: string = 'xyzuvw';
    var
      v: array[1..6] of Single;
      Source: TStringList;
      Dest: TStringList;
      I, J, n: Integer;  function GetValue(s: string; Offset, x: Integer): Integer;
      var
        n, m: Integer;
      begin
        Result := Offset;
        // [/ 后面的'-'不知是数据负号,还是标记,这里做负号处理,如果是标记,则下面要改成'[/-'
        n := PosEx(CharFlag[x] + '[/', s, Offset);
        if n = 0 then Exit;
        Inc(n, 3);
        m := PosEx(']', s, n);
        if m <> 0 then
        begin
          v[x] := StrToFloat(Copy(s, n, m - n));
          Result := m + 1;
        end;
      end;begin
      Source := TStringList.Create;
      Dest := TStringList.Create;
      try
        Source.LoadFromFile('e:\Source.txt');
        for I := 1 to 6 do
          v[I] := 0.0;
        for I := 0 to Source.Count - 1 do
        begin
          n := 1;
          for J := 1 to 6 do
            n := GetValue(Source[I], n, J);
          Dest.Add(Format('GB H%.3f I%.3f J%.3f K%.3f L%.3f',[v[1] + v[2],
                                                              v[4] - v[3],
                                                              v[5] * v[6],
                                                              v[1] / v[2],
                                                              v[6] / v[3]]));
        end;
        Dest.SaveToFile('e:\Dest.txt');
      finally
        Dest.Free;
        Source.Free;
      end;
    end;
      

  4.   

    调试后出现invalid floating point operation错误,源文件大小有17M,有些行的数据是其他格式的,例如:
    31: oL[8]( y[/-24.2] z[/4.6] )
    12: end ctx 3dPath usg(poly)
    12: beg ctx 3dPath usg(poly)
    10: tr(tech)
    10: nctx(BTC)
    10: nctx(0)
      

  5.   


    这种程序怎么在delphi里调试阿,我是初学者,不会阿!请教一下,谢谢!
      

  6.   


    var
      f,f2:textfile;
      s,s2:string;
      x,y,z,u,v,w,h,i,j,k,L:double;
      i1:integer;  function GetTokenValue(str:string;var value:double):boolean;
      var
        iPos:integer;
        iBegin,iEnd:integer;
        strTemp:string;
      begin
        if Pos(str,s)>0 then
        begin
            iBegin:=Pos(str,s)+3;
            strTemp:=Copy(s,iBegin,Length(s));
            iEnd:=Pos(']',strTemp)-1;
            value:=StrToFloat(Copy(strTemp,1,iEnd));
            result:=true;
        end else
            result:=false;
      end;
    begin
      assignfile(f,'c:\1.txt');
      assignfile(f2,'c:\2.txt');
      try
        reset(F);
        rewrite(f2);
        while not eof(f) do
        begin
          readln(f,s);      GetTokenValue('x[/',x);
          GetTokenValue('y[/',y);
          GetTokenValue('z[/',z);
          GetTokenValue('u[/',u);
          GetTokenValue('v[/',v);      H:=x+y;
          I:=u-z;
          J:=v*w;
          K:=x/y;
          L:=w/z;
          s2:=Format('GB H%.3f I%.3f J%.3f K%.3f L%.3f',[H,I,J,K,L]);
          writeln(f2,s2);
        end;
      finally
        closefile(f);
        closefile(f2);
      end;
    end;
      

  7.   

    这种程序怎么在delphi里调试阿,我是初学者,不会阿!请教一下,谢谢!
    ============================================================8楼的代码你不是调试了吗?难道是指uses StrUtils;?将StrUtils加在单元头部的uses行中,或者把uses StrUtils;放在implementation下面。
      

  8.   

    至于源文件中有没有数据的行可将:Dest.Add(Format( ....改为:if n <> 1 then
      Dest.Add(Format(....
      

  9.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Memo2: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    //此函数用于得到一个变量的值,str是一行数据,value是要输出的值,返回值用于判断是否存在该变量的值
    function GetValue(str,v:string;var value:double):boolean;
       function nPos(substr,str:string;ibegin:integer):integer;
       var
       i:integer;
       begin
       result:=ibegin;
       for i:=ibegin to length(str) do
          if str[i]=substr then
             begin
             result:=i;
             break;
             end;
       end;
    var
    i:integer;
    aa,bb:integer;
    s:string;
    begin
    i:=pos(v,str);
    if i=0 then begin result:=false;exit;end;//找不到则退出
    aa:=i+2;//某变量值开始位置
    i:=npos(']',str,aa); //取得最近的]的位置
    if i=aa+1 then begin result:=false;exit;end;//为空则退出
    s:=copy(str,aa+1,i-aa-1);//取出中间的数据
    try
    value:=strtofloat(s);
    result:=true;
    except
    result:=false;//如果不是数字则退出
    exit;
    end;
    end;
                                //这里是缺省值,如果源文本中某一行缺少某一个变量的值则沿用先前行的值
    procedure doLine(str:string;var Default_x,Default_y,Default_z,Default_u,Default_v,Default_w:double);//此函数用于处理一行数据
    var
    x,y,z,u,v,w,H,I,J,K,L:double;
    s:string;
    f:textfile;
    begin
    //取出各变量的值
    try
    assignfile(f,'c:\2.txt');
    if FileExists('c:\2.txt') then
       append(f) else rewrite(f);
    if not Getvalue(str,'x',x) then
       x:=Default_x;//如果源文本中某一行缺少某一个变量的值则沿用先前行的值
    if not Getvalue(str,'y',y) then
       y:=Default_y;//如果源文本中某一行缺少某一个变量的值则沿用先前行的值
    if not Getvalue(str,'z',z) then
       z:=Default_z;//如果源文本中某一行缺少某一个变量的值则沿用先前行的值
    if not Getvalue(str,'u',u) then
       u:=Default_u;//如果源文本中某一行缺少某一个变量的值则沿用先前行的值
    if not Getvalue(str,'v',v) then
       v:=Default_v;//如果源文本中某一行缺少某一个变量的值则沿用先前行的值
    if not Getvalue(str,'w',w) then
       w:=Default_w;//如果源文本中某一行缺少某一个变量的值则沿用先前行的值
    Default_x:=x;
    Default_y:=y;
    Default_z:=z;
    Default_u:=u;
    Default_v:=v;
    Default_w:=w;
    H:=x+y;
    I:=u-z;
    J:=v*w;
    K:=x/y;
    L:=w/z;
    s:=Format('GB H%.3f I%.3f J%.3f K%.3f L%.3f',[H,I,J,K,L]);
    writeln(f,s);
    finally
    closefile(f);
    end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
    x,y,z,u,v,w,Default_x,Default_y,Default_z,Default_u,Default_v,Default_w:double;
    f:textfile;
    str:string;
    begin
    Default_x:=1;
    Default_y:=1;
    Default_z:=1;
    Default_u:=1;
    Default_v:=1;
    Default_w:=1;
    assignfile(f,'c:\1.txt');
    try
        reset(F);
        while not eof(f) do
        begin
        readln(f,str);
        doline(str,Default_x,Default_y,Default_z,Default_u,Default_v,Default_w);
        end;
    finally
        closefile(f);
      end;
    end;end.
      

  10.   

    假如我想在输出后的文本的头和尾都加上自定义的文字怎么办呢?
    比如:
    s01 design by hust
    s02 class 3
    …… 
    GB H1.0 I40.824 J7.735 K.736 L35 
    GB H2.12 I10.994 J17.335 K2.866 L66 
    GB H10.50 I20.887 J71.643 K10.931 L2 
    …… 
    s1000 end load
    s1000 data 08/06/06
      

  11.   

    lz应该学一些基础性的东西,或者多动点脑筋,上面几个回复中都有格式化写文件或者写流的样板,依样画葫芦,在转换前后加一些“自定义的文字”应该不是难事,如果这样的问题都要问,你会得不到答案的。我说话直了些,希望对LZ有帮助,否则,LZ的编程水平很难达到较高的水平(除了天份,还要勤奋和多动脑)。
      

  12.   

    还补充一句lz不爱听的话,提问时,最好把问题搞清楚,尽量一次性把意思表达出来,免得别人照你前面的意思答复了,后面又变了或者附加不少条件,一次两次还行,多次后别人会烦的,换了是你也一样!我的所有回复,LZ只当不存在,都可掠过!