将行读入变量

时间:2018-04-24 18:16:26

标签: freepascal

我脱掉了头发!

我尝试用免费的pascal来帮助我的一个padawan。

我一开始就陷入困境。我想做的就是别的,只需将文件行读入变量。

文件的结构只是:

CityNameWithoutSpace ProductName ProductCount

这是我的代码:

procedure TmainForm.readProcutsBtnClick(Sender: TObject);

var
  i: Integer;
  productCity: string;
  productName: string;
  productCount: Integer;
  productFileIn: TextFile;

begin

  assignFile(productFileIn, 'termek.txt');
  reset(productFileIn);
  i := 0;
  while not EOF(productFileIn) do
      begin
         i := i + 1;
        readLn(productFileIn, productCity, productName, productCount);
  end;
  closefile(productFileIn);

end;                    

问题在于它会引发异常。

如果我只使用有效的readLn(productFileIn, productCity);productCity将是整行。

但是如何将空格分隔成这些变量呢?

编辑:

Doc非常糟糕且完全令人困惑:readLn参考read,请阅读使用一些"魔法"我真的不懂char C

1 个答案:

答案 0 :(得分:1)

最简单的方法是将整行读入一个字符串,然后将其拆分为变量。正如@Rudy所说,字符串的ReadLn()操作无法知道如何分隔字符串。

请参阅下面的示例,其中整个文件都加载到字符串列表中。之后,所有列表项都被拆分为一系列产品记录。

type
  TProductRec = record
    productCity: string;
    productName: string;
    productCount: Integer;
  end;

var
  productArray : array of TProductRec;
  aList : TStringList;
  i : Integer;
  sArray : TStringArray;
begin
  aList := TStringList.Create;
  try
    aList.LoadFromFile('termek.txt');
    SetLength(productArray,aList.Count);
    for i := 0 to aList.count-1 do begin
      sArray := aList[i].Split([' ']);
      if Length(sArray) = 3 then begin
        productArray[i].productCity := sArray[0];
        productArray[i].productName := sArray[1];
        productArray[i].productCount := StrToInt(sArray[2]);
      end;
    end;
    // Do something with the product record array
  finally
    aList.Free;
  end;
end;

//免责声明:未经测试,但您可以获得图片