Q&A

  • mid 화일을 hex화일로 바꾸는데 중간에 잘리는 현상
안녕하세요. 선수님께 부탁 드립니다.

노래화일 mid을 txt로 hex로 저장시키는데 화일안에 내용이 많은데도 중간에 EOF 가 옵니다.
<방법1> <방법2> 를 해 보아두 20k인 mid 는 잘 되는데 그 이상은 안되는 같습니다.

<방법1>
procedure TForm1.Button2Click(Sender: TObject);
var
  F1, F2        : TextFile;
  Ch            : Char;
  i,j           : integer;
  s,s1          : ansistring;
  input_file    : string;   // mid 화일명
  write_file    : string;   // 만들 txt화일명
begin
  input_file := edit1.Text; // mid 화일명
  write_file := edit2.Text; //만들 txt 화일명
  AssignFile(F1, input_file);
  Reset(F1);
  AssignFile(F2, write_file);
  Rewrite(F2);
  j :=0;
  while not(Eof(F1)) do
  begin
                s :='';
                i :=0;
                j :=j+1;
                Read(F1, ch);
                i := integer(ch);
                s := '0x'+inttohex(i,2)+', ';
                Write(F2, s);
  end;
  CloseFile(F2);
  CloseFile(F1);
  Showmessage('작업 끝.. ');
end;


<방법2>
var
f: file;
p: pointer;
fs: integer;
begin

AssignFile(f, 'aa.mid');
Reset(f);
fs := FileSize(f);  <- fs에는 188개밖에 안오더라구요. 갯수는 288개 정도되는데
GetMem(p, fs);
try
   CloseFile(f);
finally
   FreeMem(p, fs);
end;
1  COMMENTS
  • Profile
    최용일 2005.10.07 11:30
    안녕하세요. 최용일입니다.

    중간에 잘린걸로 봐서는 텍스트파일이 아닌것같네요...

    텍스트파일에서 Eof는 실제 파일의 끝뿐만아니라 아스키의 제어코드인 Eof($1A=26, Ctrl+Z)도 체크를 합니다.

    TextFile대신에 file, file of Byte와 같은 이진파일로 여세요...

    방법2에서 그냥 file을 사용할 경우 Reset(f);가 아니라 Reset(f, 1);로 하셔야 될겁니다.
    file of Byte와 같은 형태화파일에선 Reset(f);이 맞구요...
    이진파일은 블럭단위로 읽고 씁니다. 하드디스크의 클러스터 개념이라고 보시면 될듯...
    한번에 읽고 쓰는 이러한 블럭을 레코드라고 하는데 기본적으로 128바이트입니다.
    아무런 설정을 안하시면 한바이트를 읽더라고 128바이트가 읽혀집니다.
    FileSize함수는 이 레코드의 갯수를 반환합니다.

    ^^ 항상 즐코하세요...