Clu*_*ess 5 pascal freepascal file fpc
我有一个具有指定结构的文本文件,即(对于每一行):char,space,char,space,double value,endline.例如
q w 1.23
e r 4.56
t y 7.89
Run Code Online (Sandbox Code Playgroud)
在Free 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.
Run Code Online (Sandbox Code Playgroud)
您可以使用TStringList类来加载文件和DelimitedText属性来拆分另一个 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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9964 次 |
| 最近记录: |