TYPE
TTwoDimIntArr = ARRAY OF ARRAY OF Cardinal;
PROCEDURE SetValue(VAR ARR : TTwoDimIntArr ; Chapter,Paragraph,Value : Cardinal);
BEGIN
IF Chapter>=LENGTH(ARR) THEN SetLength(ARR,SUCC(Chapter));
IF Paragraph>=LENGTH(ARR[Chapter]) THEN SetLength(ARR[Chapter],SUCC(Paragraph));
ARR[Chapter,Paragraph]:=Value
END;
FUNCTION GetValue(CONST ARR : TTwoDimIntArr ; Chapter,Paragraph : Cardinal) : Cardinal;
BEGIN
IF Chapter>=LENGTH(ARR) THEN
Result:=0
ELSE IF Paragraph>=LENGTH(ARR[Chapter]) THEN
Result:=0
ELSE
Result:=ARR[Chapter,Paragraph]
END;
FUNCTION ParseFile(CONST FileName : STRING) : TTwoDimIntArr;
VAR
SL : TStrings;
S : STRING;
P,Q : Cardinal;
{$IFDEF DELPHI7 }
I : Cardinal;
{$ENDIF }
BEGIN
SL:=TStringList.Create;
TRY
SL.LoadFromFile(FileName);
{$IFDEF DELPHI7 }
FOR I:=1 TO SL.Count DO BEGIN
S:=SL[PRED(I)];
{$ELSE }
FOR S IN SL DO BEGIN
{$ENDIF }
P:=POS(',',S);
Q:=PosEx(',',S,SUCC(P));
SetValue(Result,StrToInt(COPY(S,1,PRED(P))),StrToInt(COPY(S,SUCC(P),PRED(Q-P))),StrToInt(COPY(S,SUCC(Q),255)))
END
FINALLY
SL.Free
END
END;
ParseFile 解析文件并以二维动态数组的形式返回。如果你 100% 确定你没有超出数组的边界,你可以直接访问它。否则,GetValue 函数是访问数组内容的安全包装器。
将其用作:
USES ... StrUtils ...;
.
.<My Code>
.
VAR ARR : TTwoDimIntArr;
BEGIN
ARR:=ParseFile(<FileName>);
.
.
.
Words:=GetValue(ARR, <Chapter>, <Paragraph>);
.
.
END.
如果Delphi 7没有StrUtils中的PosEx函数,可以如下编码:
FUNCTION PosEx(CONST SearchFor,SearchIn : STRING ; StartPos : Cardinal = 1) : Cardinal;
BEGIN
Result:=POS(SearchFor,COPY(SearchIn,StartPos,$7FFFFFFF));
IF Result>0 THEN INC(Result,PRED(StartPos))
END;