2013-03-30 32 views
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; 

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

CoronelMostaza Candelabro Vestibulo

本质上讲,这就是我想:

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

这就是我到目前为止所尝试的:

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

我试过关闭IO检查没有结果,最接近我有这个问题的答案是分配第一个字到第一个变量,但总是以错误或空变量结束。请帮助我,如果您愿意,请告诉我所有这些背后发生的事情!

+0

您正在阅读的文本文件是否包含序列值或“pha”类型的名称?在这种情况下'5 15 10'或'CoronelMostaza Candelabro Vestibulo'。 –

+0

该文本文件包含pha中的名字以及一些我必须阅读的整数。名称也分别在p,h,a的子类型中。 – Josepas

回答

1

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

申报AA文本常量包含这些文字:

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; 

该文件包含文本信息,所以你必须要翻译将文本转换为您的数据类型。 在classesh.inc使用TStringList一个简单的例子:

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。我将把错误处理作为练习。

+0

谢谢soo! – Josepas