1

我会尽量做到最短。我的程序中有这些数据类型。

type
  pha = (SenoraBlanco, SenorVerde, SenoraCeleste, ProfesorCiruela,
    SenoritaEscarlata, CoronelMostaza, Biblioteca, Cocina, Comedor, Estudio,
    Vestibulo, Salon, Invernadero, SalaDeBaile, SalaDeBillar, Candelabro,
    Cuchillo, Cuerda, LlaveInglesa, Revolver, Tubo);

  a = Candelabro..Tubo;
  h = Biblioteca..SalaDeBillar;
  p = SenoraBlanco..CoronelMostaza;

  sbr = record
    arma: a;
    habt: h;
    prj: p;
  end;

var
  game: text;
  sobre: sbr;

我想从文件中读取这一行,然后将其分配给变量 sobre, 的字段type sbr

CoronelMostaza Candelabro Vestibulo

基本上这就是我正在尝试的:

sobre.prj  := CoronelMostaza;
sobre.arma := Candelabro;
sobre.habt := Vestibulo;

这是我迄今为止尝试过的:

ReadLn(game, sobre.prj, sobre,arma, sobre.habt);

我试过关闭 IO 检查但没有结果,我最接近这个问题的答案是将第一个单词分配给第一个变量,但总是以错误或空变量结尾。请帮助我,如果你愿意,请告诉我这一切背后发生了什么!

4

1 回答 1

1

假设文本文件包含 type 的类型文字pha

声明一个包含这些文字的文本常量:

const
  phaStr : array[pha] of string = ('SenoraBlanco', 'SenorVerde', 'SenoraCeleste', 'ProfesorCiruela',
    'SenoritaEscarlata', 'CoronelMostaza', 'Biblioteca', 'Cocina', 'Comedor', 'Estudio',
    'Vestibulo', 'Salon', 'Invernadero', 'SalaDeBaile', 'SalaDeBillar', 'Candelabro',
    'Cuchillo', 'Cuerda', 'LlaveInglesa', 'Revolver', 'Tubo');

要获取这些字符串文字之一的整数索引:

function IndexOfPhaStr( const aStr : string) : integer;
var
  aPHA : pha;
begin
  Result := -1;
  for aPHA := Low(pha) to High(pha) do
  begin
    if (aStr = phaStr[aPHA]) then
    begin
      Result := Ord(aPHA);
      break;
    end;
  end;
end;

该文件包含文本信息,因此您必须将文本转换为您的数据类型。使用TStringListin的简单示例classesh.inc

var

  i : Integer;
  sList : TStringList;
  s : String;
  ix : array [1..3] of integer;
begin
  ...
  sList := TStringList.Create;
  sList.Delimiter := ' ';
  AssignFile(game,'TEST.Txt');
  Reset(game);
  System.ReadLn(game, s);
  System.CloseFile(game);
  sList.DelimitedText := s;
  for i := 0 to 2 do
    ix[i+1] := IndexOfPhaStr(sList[i]);
  if (ix[1] in [Ord(Low(p))..Ord(High(p))])
    then sobre.prj := pha(ix[1]);
  if (ix[2] in [Ord(Low(a))..Ord(High(a))])
    then sobre.arma := pha(ix[2]);
  if (ix[3] in [Ord(Low(h))..Ord(High(h))])
    then sobre.habt:= pha(ix[3]);
  sList.Free;
end;

如果您的文本文件包含更多信息,请同时为它们进行文本转换。

PS。我将把错误处理留作练习。

于 2013-03-30T10:48:17.053 回答