안녕하세요. 선수님께 부탁 드립니다.
노래화일 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;
중간에 잘린걸로 봐서는 텍스트파일이 아닌것같네요...
텍스트파일에서 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함수는 이 레코드의 갯수를 반환합니다.
^^ 항상 즐코하세요...