program s23; {$APPTYPE CONSOLE} uses SysUtils, Types, Windows, Classes, Math, MMSYSTEM; type LStreamItem=record //A bemenet egy sorát jellemzi name:string; //Fájlnév - bemenetből start:integer; //Kezdet - ezt számítani kell size:integer; //Méret - bemenetből next:integer; //A következő darab helye checked:boolean; //Bejárásjelző end; TFileItem=class //Egy fájl jellemzői Desc:string; //A darabok helye "x-y z-v" stb. size:integer; //Az egész fájl mérete constructor Create(aDesc:string; aSize:integer); end; var f:text; s1:string; x,y:integer; lines:integer; Stream:array of LStreamItem; FNames:TStringList; fname:string; fdesc:string; fsize:integer; constructor TFileItem.Create; begin desc:=aDesc; size:=aSize; end; function DescString(x:integer):string; begin Result:=IntToStr(Stream[x].start+1)+'-'+IntToStr(Stream[x]. start+Stream[x].size); end; begin try FNames:=TStringList.Create; assign(f,ParamStr(1)); lines:=0; //A sorok számának meghatározása reset(f); while not eof(f) do begin readln(f); inc(lines); end; // writeln('1. f zis k‚sz'); SetLength(stream,lines); close(f); reset(f); for x:=0 to Lines-1 do with Stream[x] do begin readln(f,s1); y:=Pos(' ',s1); name:=copy(s1,1,y-1); s1:=copy(s1,y+1,Length(s1)-y); y:=Pos(' ',s1); size:=StrToInt(copy(s1,1,y-1)); next:=StrToInt(copy(s1,y+1,Length(s1)-y))-1; checked:=false; if x=0 then start:=0 else start:=Stream[x-1].start+Stream [x-1].size; end; // writeln('2. f zis k‚sz'); //A fájlok adatainak összeálítása x:=0; while x-1) and not Stream[y].checked do begin Stream[y].checked:=true; fdesc:=fdesc+' '+DescString(y); fsize:=fsize+Stream[y].size; y:=Stream[y].next; end; if y=-1 then begin FNames.AddObject(fname,TFileItem.Create(fdesc,fsize)); end else begin y:=FNames.IndexOf(fname); with TFileItem(FNames.Objects[y]) do begin Desc:=fdesc+' '+desc; size:=fsize+size; end; end; end; end; close(f); // writeln('3. f zis k‚sz'); //Sorbarendezés FNames.Sort; if FNames[0]='---' then begin FNames[0]:='--- szabad'; //Anomália! FNames.AddObject(FNames[0],FNames.Objects[0]); FNames.Delete(0); end; // writeln('4. f zis k‚sz'); //Az adatok kiírása a célfájlba assign(f,ParamStr(2)); rewrite(f); for x:=0 to FNames.Count-1 do with TFileItem(FNames. Objects[x]) do writeln(f,FNames[x],' ',size,' ',desc); close(f); // writeln('5. f zis k‚sz'); //Takarítás... for x:=0 to FNames.Count-1 do TFileItem(FNames.Objects[x]).Free; FNames.Free; except on E:Exception do writeln(E.Message); end; end.