请问如何用流操作来读取文本文件里的浮点数据,我有用过TStringList变量做过,但是那需要用StrToFloat转换,严重影响运行效率,请问大虾们有什么效率高的方法,即使不用流操作也行啦,文本文件里的数据格式如下:
0   0   1   1
1.2 2.3 3.4 4.5
2.4 3.5 4.6 5.7
请多多帮助!

解决方案 »

  1.   

    tfilestream读取二进制还好,如果你的是文本,还是需要转换地
      

  2.   

    这个浮点数都是以字符串型式存放,作类型转换是必然需要的。如果用TStringList比较慢,那原因可能是文件比较大,要一下子全部装入内存,
    倒不是因为字符串转浮点数慢。
      

  3.   

    while not Eof(MyFile) do
       begin
         Readln(MyFile,i);
       .....
       end;
      

  4.   

    //读流
    procedure ReadDataFromStream(AStream : TStream);
    var
       vC : Char;
       vS : string;
    begin
        vS := '';
        while AStream.Read(vC, 1) = 1 do
        begin
            if vC <> ' ' then 
            begin
               vS := vS + vC;
            end
            else begin
               if vS <> '' then
               begin
                   DisposeFloatData(vS);
               end;
               vS := '';
            end;
        end;
    end;//处理浮点数
    procedure DisposeFloatData(AData : String);
    var
       vF : Double;
    begin
       vF := StrtoFloat(AData);
       ....
    end;
      

  5.   

    langfei(浪费) 的方法不错呀!
      

  6.   

    //我写了一个简单的program Project1;{$APPTYPE CONSOLE}uses
      SysUtils, Classes;type
      TReadFloatCallback = procedure (const aFloat: Extended; const aParam: Pointer);procedure ReadFloatDataProc(const aFileName: string;
        aReadFloatCallback: TReadFloatCallback;
        const aParam: Pointer);
    var
      FileStream: TFileStream;
      Parser: TParser;
    begin
      FileStream := TFileStream.Create(aFileName, fmOpenRead or fmShareDenyWrite);
      try
        Parser := TParser.Create(FileStream);
        try
          while Parser.Token <> toEOF do
          begin
            if Parser.Token in [toFloat, toInteger] then
              aReadFloatCallback(Parser.TokenFloat, aParam);        Parser.NextToken;
          end;
        finally
          Parser.Free;
        end;
      finally
        FileStream.Free;
      end;
    end;procedure ReadFloatCallback(const aFloat: Extended; const aParam: Pointer);
    //overwrite this procedure your self
    begin
      Writeln(FloatToStr(aFloat));
    end;begin
      ReadFloatDataProc('C:\File1.txt', ReadFloatCallback, nil);
      ReadLn;
    end.