Q&A

  • 파일을 읽어와 배열에 저장하는 방법 좀 알려주세요
궁금한게 있어 몇자 적습니다.
파일을 읽어서 배열에 저장하려고 하는데요.. 잘안되네요...
읽을 파일은 .shp 파일 이구요...
레코드 구조가 이렇게 되어 있습니다..

PolyLine
{
     Double[4]                      Box
     Integer                          NumParts
     Integer                          NumPoints
     Integer[NumParts]        Parts
     Point[NumPoints]          Points
}

Field                       value                         Type                  Number
ShapeType                3                           Integer                    1
Box                          Box                         Double                      4
NumParts               NumParts                 Integer                     1
NumParts               NumPoints                Integer                     1
Parts                        Parts                       Integer                     NumParts
Points                      Points                      Integer                     NumPoints

이렇게 되면..

function UtShapeFile.Load(filename : String) : Integer;
var
  FH, iCount, tmp, i, n, ret : Integer;
  numpart, numpoint, parts, points : Integer;
  partidx, pointidx : array of Integer;
begin
  FH := FileOpen(filename, fmOpenRead);
  iCount := FileRead(FH, MainFileHeader, SizeOf(MainFileHeader));

  if (MainFileHeader.ShapeType = 3) then
  begin
    while (true) do
    begin
      ret := FileRead(FH, tmp, SizeOf(Integer));
      if (ret <> SizeOf(Integer)) then
        break;
      tmp := FileSeek(FH, SizeOf(Integer) * 1, 1);
      tmp := FileSeek(FH, SizeOf(Double) * 4, 1);

      numpart := FileRead(FH, numpart, SizeOf(Integer));
      numpoint := FileRead(FH, numpoint, SizeOf(Integer));
      SetLength(partidx, numpart);
      SetLength(pointidx, numpoint);

      partidx := FileRead(FH, partidx, SizeOf(Integer) * numpart);   // 에러발생

    end;
  end;
  FileClose(FH);
  Result := 1;
end;


이런식으로 해주면 안되는 건가요?
책을봐도 모르겠고.. 고수님들의 명쾌한 답변 부탁드립니다...ㅜㅜ
1  COMMENTS
  • Profile
    이중철 2005.02.27 02:58
    밑에 머털도사와 같은분 또는 같은 직장에 계시는군요
    일단 문제점만 고쳐드릴께요

    몇년전부터 Fireread안써와서 ^^
    FileRead(FH, partidx, SizeOf(Integer) * numpart);
    이게 아니라..
    FileRead(FH, partidx[0], SizeOf(Integer) * numpart);
    이렇게 하세요

    먼저 델파이의 배열에서 Fixed array 와 Dynamic array이 가 있는것을 아시죠
    var
      A : array[0..12] of byte;
      B : array of byte;
    begin
      setlength(B, 13);
    end;

    이 의미는 아래와 같습니다.
    A = A[0]
    B = @B[0]
    B는 결국 포인터 입니다.


    결국 Fixed array와 Dynamic array를 쓸때에는 달리해야 한다는 것입니다.
    개념적으로 틀리다는 것을 명심하고 작업하세요

    이문제는 스트링도 같습니다.
    var
      sd : string;
      sf : stirng[20];

    sd는 4바이트 포인터
    sf는 20바이트 스트링


    그리고 만약 그 파일에 여러레코드가 있다면 아래 방법은 별로 좋은 방법은 아닙니다.
    즉, FileSeek와 FileRead, Setlength가 레코드 갯수만큼 반복할 가능성(레코드수 X 5~6) 다분함
    이 일은 하나의 메모리 블럭에 넣어서 해결하는게 좋고 단지 포인터만 지정하면 될듯 합니다.