2013-02-07 1 views
1

텍스트 파일을 레코드 배열로 읽습니다. 텍스트 파일에있는 데이터의 일부는 프로그램 등급과 시험 성적입니다. 프로그램에서 배열을 접거나 레코드의 필드로 값을 테스트 할 정수 배열을 선언 할 수 있습니까? 그렇다면 필드의 개별 프로그램 값에 어떻게 액세스합니까? 예를 들어이 레코드를 이렇게 선언 할 수 있습니까? 그렇다면 테스트 [3]에서 데이터를 입력하거나 액세스하는 방법은 무엇입니까?Delphi에서 레코드 배열로 정수 배열을 사용할 수 있습니까?

nametype = record 
    first : string[10]; 
    mi : string[3]; 
    last : string[30]; 
end; 
stype = record 
    id : integer; 
    name : nametype; 
    prog : array[1..10] of integer; 
    test : array[1..3] of integer; 
    progave, quizave : real; 
    average : double; 
    grade : char; 
end; 
sarraytype = array[1..100] of stype; 
var 
    student : sarraytype; 

그래서 내가 갇혀있는 곳이이 어레이를 읽는 것 같아요. 지금까지 내 읽기 내가 가진 :

procedure TstudentData.openButtonClick(Sender: TObject); 
    begin 
    var i : integer; 
    if open.execute then 
    begin 
     assignfile(inf,open.FileName); 
     reset(inf); 
     i := 1; 
     while not eof(inf) do with student[i] do 
     begin 
     readln(inf, id, name.first, name.mi, name.last); 
     i := i + 1; 
     end; 
    end; 
    i:=1; 
end; 

나는 다른 데이터에 대한 읽기를 가지고,하지만 난 음식물 및 테스트 배열로 읽는 방법에 대한 총 손실에 있어요.

+3

예 당신이 할 수있는 것입니까? 시도해 보았 니? –

답변

6

하실 수 있습니다. 예를 들어으로 ...

var 
    a: sarraytype; 
    i, j: integer; 
begin 
    for i := low(a) to High(a) do 
    for j := low(a[i].test) to High(a[i].test) do 
     a[i].test[j] := i * 100 + j; 
    for i := low(a) to High(a) do 
    for j := low(a[i].test) to High(a[i].test) do 
     Memo1.Lines.Add(IntToStr(a[i].test[j])); 

end; 

귀하의 코멘트 BTW

var 
    a,b: sarraytype; 
    i, j: integer; 
    fs:TFileStream; 
begin 
    for i := low(a) to High(a) do 
    begin 
    for j := low(a[i].test) to High(a[i].test) do 
     a[i].test[j] := i * 100 + j; 
    a[i].name.first := 'Test' + IntToStr(i); 
    end; 

    fs := TFileStream.Create('C:\temp\test.bin',fmCreate); 
    try 
    fs.Write(a,sizeOf(a)); 
    finally 
    fs.Free; 
    end; 

    fs := TFileStream.Create('C:\temp\test.bin',fmopenRead); 
    try 
    fs.Read(b,sizeOf(b)); 
    finally 
    fs.Free; 
    end; 

    for i := low(b) to High(b) do 
    begin 
    memo1.Lines.Add(b[i].name.first); 
    for j := low(b[i].test) to High(b[i].test) do 
     Memo1.Lines.Add(IntToStr(b[i].test[j])); 

    end; 

end; 

에 대한 응답으로 :

일반적인 이름은

Tnametype = record 
    first : string[10]; 
    mi : string[3]; 
    last : string[30]; 
end; 
Tstype = record 
    id : integer; 
    name : nametype; 
    prog : array[1..10] of integer; 
    test : array[1..3] of integer; 
    progave, quizave : real; 
    average : double; 
    grade : char; 
end; 

Tsarraytype = array[1..100] of stype; 
+0

이 답변은 다 나와 있습니다 :) –

+0

IMO 일반적인 명명은 다음과 같아야합니다 : TName = record ... 그리고 TStudent = "T"가 무엇인지에 대한 식별자의 "type"을 생략하는 기록. – iamjoosy

관련 문제