在免费的pascal

问题描述 投票:0回答:3
在自由pascal中“提取”这些值的正确方法是什么?

freepascal具有sysutils中的功能SSCANF(您可能知道是否从其他语言中知道..)
我修改了RRUZ的示例以显示如何使用它。

uses SysUtils; type TData=object Val1 , Val2 : String; Val3 : Double; end; procedure ProcessFile(aFileName:String); var F : Text; LData : TData; Line : String; begin DecimalSeparator:='.'; AssignFile(F,aFileName); Reset(F); while not eof(F) do begin ReadLn(F,Line); SScanf(Line,'%s %s %f',[@LData.Val1,@LData.Val2,@LData.Val3]); //do something with the data WriteLn(LData.Val1); WriteLn(LData.Val2); WriteLn(LData.Val3); end; end; begin ProcessFile('C:\Bar\Foo\Data.txt'); Writeln('Press Enter to exit'); Readln; end.

file freepascal
3个回答
6
投票
您可以使用

TStringList

类加载文件和
DelimitedText

3
投票
属性将值分配在另一个tstringlist上,然后将值存储在记录中。

检查此样品

{$mode objfpc}{$H+}

uses
  Classes, SysUtils;

{$R *.res}

type
  TData=record
    Val1: Char;
    Val2: Char;
    Val3: Double;
  end;

procedure ProcessFile;
var
  LFile  : TStringList;
  Line   : TStringList;
  i      : Integer;
  LData  : TData;
  LFormat: TFormatSettings;
begin
  //set the propert format for the foat values
  LFormat:=DefaultFormatSettings;
  LFormat.DecimalSeparator:='.';

  LFile:=TStringList.Create;
  Line :=TStringList.Create;
  try
   //load the file
   LFile.LoadFromFile('C:\Bar\Foo\Data.txt');
   Line.Delimiter:=' ';
    for i:=0 to LFile.Count-1 do
    begin
      //read the line and split the result
      Line.DelimitedText:=LFile[i];
      //some basic check
      if Line.Count  <> 3 then raise Exception.Create('Wrong data length');

      //you can add additional check here    
      LData.Val1:=Line[0][3]; 
      LData.Val2:=Line[1][4];
      LData.Val3:=StrToFloat(Line[2],LFormat);

      //do something with the data
      WriteLn(LData.Val1);
      WriteLn(LData.Val2);
      WriteLn(LData.Val3);
    end;
  finally
    Line.Free;
    LFile.Free;
  end;
end;

begin
 try
    ProcessFile;
 except on E:Exception do Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;
end.
lelet说,我们有兴趣读取一个交换后命令行参数提供的文件,其中包含字符的替换权重。

program WeightFileRead; uses SysUtils, StrUtils; var MyFile : TextFile; FirstChar, SecondChar, DummyChar : Char; Weight : Double; begin if GetCmdLineArg ('editweights', StdSwitchChars) = '' then begin WriteLn ('Syntax: WeightFileRead -editweights filename'); exit end; AssignFile (MyFile, GetCmdLineArg ('editweights', StdSwitchChars)); Reset (MyFile); try while not EOF (MyFile) do begin ReadLn (MyFile, FirstChar, DummyChar, SecondChar, Weight); WriteLn ('A: ', FirstChar, '; B: ', SecondChar, '; W: ', Weight:0:1); end finally CloseFile (MyFile) end end.

在更通用的设置中,当前两个条目可以是更长的字符串时,我们可以使用

ExtractWord

在字符串中找到the whitespace分隔的单词(或将几个空间都视为引入一个whitepse空词),然后将第三个转换为数字。
n

1
投票
ExtractSubstr

而不是

program WeightFileRead2; uses SysUtils, StrUtils; var MyFile : TextFile; FileLine : String; begin if GetCmdLineArg ('editweights', StdSwitchChars) = '' then begin WriteLn ('Syntax: WeightFileRead -editweights filename'); exit end; AssignFile (MyFile, GetCmdLineArg ('editweights', StdSwitchChars)); Reset (MyFile); try while not EOF (MyFile) do begin ReadLn (MyFile, FileLine); WriteLn ('A: ', ExtractWord (1, FileLine, [' ']), '; B: ', ExtractWord (2, FileLine, [' ']), '; W: ', StrToFloat (ExtractWord (3, FileLine, [' '])):0:1); end finally CloseFile (MyFile) end end.
[' ']

。或者,成为一个单词定界符。

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.