Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!
Vytvořit web zdarmaNa FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!
Vytvořit web zdarmaLFNsupport:=false;
- Assign, Close, Read, Readln, Reset, Rewrite, Write, Writeln, IOResult, Eof, Eoln
- FilePos, FileSize, Seek
- BlockRead, BlockWrite
Vyjmenoval jsem vechny standardn procedury a funkce jazyka pascal, kter maj co do inn se soubory.const zdroj = 'text.txt'; cil = 'text.new'; var f,g:text; {chceme-li pracovat se soubory jako textovymi, pouzijeme typ TEXT} s:string; p:longint; begin p:=0; Assign(f,zdroj); {prirazeni jmena souboru k promenne - nic jineho nedela} Assign(g,cil); Reset(f); {otevre soubor F} Rewrite(g); {zalozi soubor G - jestli uz takovy existuje, bude prepsan} while not Eof(f) do {dokud nejsme na konci souboru...} begin inc(p); Readln(f,s); {z F nacti radku textu} Writeln(g,s); {...a uloz ji do G} end; {hotovo, zpracovali jsme vsechny radky souboru} Close(f); {uzavru zdrojovy soubor} Close(g); {a cilovy taky} writeln('Soubor mel ',p,' radek.'); end.Tento zpsob koprovn m vhodu, e pracujeme po jednotlivch dcch a proto i v TP dokeme zpracovat soubory vt ne 64 KB. Nevhodou je, e typ string udr max. 255 znak. Vyskytne-li se v souboru dka del, jsou vechny znaky za 255. ignorovny. Je nepravdpodobn, e byste se s takovmto textovm souborem setkali, ale stane se vm to, kdy budete tmto zpsobem koprovat jin soubory ne texty (soubory EXE, JPG, atd.)
Readln(f,s)Writeln(g,s)ELO vek jmno ----------------------------------------------------- 2312 62 Karek Petr 2300 24 Petrek Ondej 2277 33 asn Iveta 2239 50 Hoznour Ren 2215 22 Lapa VilmZpracujeme ho nsledovn:
const zdroj = 'test.txt'; max = 50; type sachista = record elo:integer; {pro ty, co nevedi, ELO je vykonnost sachisty} vek:byte; jmeno:string[30]; end; var f:text; {chceme-li pracovat se soubory jako textovymi, pouzijeme typ TEXT} s:string; p,q:integer; u:char; hrac:array[1..max] of sachista; begin p:=0; Assign(f,zdroj); Reset(f); readln(f); {preskocim prvni dve radky} readln(f); while not Eof(f) do {dokud nejsme na konci souboru...} begin inc(p); Read(f,hrac[p].elo); {nechceme nacist celou radku, ale jen prvni cislo} Read(f,hrac[p].vek); {proto Read, ne Readln} Read(f,u); {nacteme "prebytecny" znak - oddelovaci mezeru} Readln(f,hrac[p].jmeno); {a cele to ukoncime nactenim jmena} end; Close(f); {uzavru zdrojovy soubor} writeln('Na soupisce je ',p,' hracu:'); for q:=1 to p do writeln(hrac[q].jmeno,#9,hrac[q].vek,#9,hrac[q].elo); readln; end.Vtina programtor by ale tuto lohu eila tak, e by naetli celou dku a pak by ji rozebrali etzcovmi funkcemi. Postupn ten m toti zvan omezen:
2312, 62, Karek Petr toto ale mon je: 2312 62 Karek Petr)const zdroj = 'test.exe'; cil = 'test.ex~'; delka_kusu = 65535; type sachista = record elo:integer; {pro ty, co nevedi, ELO je vykonnost sachisty} vek:byte; jmeno:string[30]; end; var f,g:file; {netypove soubory jsou typu FILE} {(typove by bylo FILE of <neco>} {napr. file of sachista)} p,i:word; l:longint; buffer:array[1..delka_kusu] of byte; begin Assign(f,zdroj); Assign(g,cil); Reset(f,1); {u netypovych souboru urcim delku bloku. Prakticky vzdy 1 bajt} l:=FileSize(f); Rewrite(g,1); p:=0; while not Eof(f) do {dokud nejsme na konci souboru...} begin inc(p); BlockRead(f,buffer,delka_kusu,i); {zkusim nacist DELKA_KUSU bajtu, ale je} {mozne, ze se nacte mene, protoze soubor} {je kratsi nebo uz jsme neco nacetli predtim} {pocet skutecne nactenych bajtu se nastesti ulozi do I} BlockWrite(g,buffer,i); {...a techto I bajtu zapisu do druheho souboru} end; Close(f); Close(g); writeln('Soubor je velky ',l,' bajtu.'); writeln('Zkopiroval jsem ho v ',p,' krocich.'); readln; end.Tato metoda koprovn m vhodu, e doke bez pokozen zkoprovat jakkoliv soubory - neplat tu omezen o maximln dlce dku. Je ale teba dvat pozor na omezen Turbo pascalu, na maximln velikost promnn 64KB. Nkdy to nen problm (teba pi koprovn soubor), jindy je to obtnj, teba kdy natme obrzek. Je teba stle hldat dekompriman rutinu, aby nedola na konec zdrojovho bufferu a prbn "dotat" dal data.
const soubor = 'test.txt'; type sachista = record elo:integer; {pro ty, co nevedi, ELO je vykonnost sachisty} vek:byte; jmeno:string[20]; end; const soupiska1:array[1..5] of sachista = ((elo:2113; vek:35; jmeno:'Mrzek Jan'), (elo:2104; vek:56; jmeno:'Kepelka Vclav'), (elo:2088; vek:24; jmeno:'Stblov Klra'), (elo:2039; vek:40; jmeno:'Pichour Otakar'), (elo:1992; vek:25; jmeno:'arfov Ilona')); var f,g:file of sachista; soupiska2:array[1..5] of sachista; i:word; begin {Takhle soupisku ulozime} Assign(f,soubor); Rewrite(f); {opet neuvadim velikost bloku} for i:=1 to 5 do Write(f,soupiska1[i]); Close(f); {A takhle nacteme a zobrazime} Assign(g,soubor); Reset(g); for i:=1 to 5 do begin Read(g,soupiska2[i]); writeln(soupiska2[i].jmeno,#9,soupiska2[i].vek,' ',soupiska2[i].elo); end; Close(g); readln; end.
... Assign(f,'c:\pascal\soubor.dat'); {$I-} Reset(f,1); {$I+} n:=IOresult; if n<>0 then begin if n=2 then writeln('Soubor neexistuje (ale cesta jo)') else if n=3 then writeln('Neexistujc cesta') else if n=4 then writeln('Prilis mnoho poskrabanych souboru') else writeln('Nejaka chyba'); Exit; end; {$I-} BlockRead(f,buffer,sizeof(buffer),i); {$I+} n:=IOresult; if n<>0 then begin if n=100 then writeln('Chyba pri cteni z disku (poskrabane CD?)') else writeln('Nejaka chyba'); Exit; end;Podle m je neustl pepnn $I+/- blbost. Lep mi pjde dt prost na zatek programu $I- a dl u s tm nearovat. Ovem pozor! Jestlie se v $I- reimu vyskytne chyba, jsou vechny vstupn/vstupn operace zablokovny do t doby, ne zavolte funkci IOresult. IOresult toti nen promnn, je to funkce, kter krom toho, e vrac kd chyby jet odblokuje vnitn pojistku a umon tak znovu pracovat se soubory. Jestlie se tedy vyskytne njak chyba a vy ji pomoc IOresult nezpracujete, tak v program pestane pracovat se soubory na disku a vy si toho nevimnete.
Function ExistFile(s:string):boolean; {Zjisti,zda dany soubor existuje } {potrebuje unit DOS} var r:searchrec; begin if s='' then begin ExistFile:=false;Exit;end; FindFirst(s,archive+hidden+readonly+sysfile,r); ExistFile:=DosError=0; end;Tento kd bude samozejm fungovat i ve Freepascalu.
Function ExistDir(s:string):boolean; {Zjisti,zda dany adresar existuje } {potrebuje unit DOS} var r:searchrec; a:byte; begin if s='' then begin ExistDir:=false;Exit;end; if Copy(s,a,1)='\' then dec(s[0]); r.attr:=0; FindFirst(s,directory,r); if DosError=0 then begin if ExistFile(s+'\nul') then ExistDir:=true else ExistDir:=false; end else ExistDir:=false; end;Posledn vc, kterou bych chtl v tomto oddle zmnit, je voln funkce FindFirst. I kdy hledte jenom adrese, tak doporuuju brt v prvn chvli vechno a vstup filtrovat a potom. Do parametru atributy ale v dnm ppad nedvejte konstantu AnyFile, jinak budete dostvat prapodivn chyby, kter jsou o to zludnj, e se objevuj jen na nkterch potach (systmech) a na jinch ne.
Procedure Nacti_soubory_a_ne_adresare(adresar:string); var r:registers; if maska='' then maska:='*.*'; findfirst(adresar+'*.*',readonly+directory+sysfile+archive,r); while doserror=0 do{dokud je neco nalezeno...} begin if (r.attr and directory)=0 then{...a neni to adresar (ma se delat seznam souboru, ne adresaru)} ZpracujSoubor(r.name); findnext(r); end;
uses objects; const SOUBOR='soubor.dat'; NOVYNAZEV='soubor.new'; var f,g:TDOSstream; begin f.init(SOUBOR,stOpenRead); {pristup jen pro cteni} g.init(NOVYNAZEV,stCreate); {vytvori novy soubor} g.CopyFrom(f,f.GetSize); f.Done; g.Done; writeln('Soubor ',SOUBOR,' byl zkopirovan do ',NOVYNAZEV,'.'); readln; end.Streamy maj geniln metodu CopyFrom, kter ve vznamn uleh. V nsledujcm pkladu budeme soubor nejenom koprovat, ale i kdovat, take ns ek vce prce:
uses objects; {$R-,$O-} {pri kodovani nechci dostavat priblble chyby o} {preteceni/podteceni bajtu} const SOUBOR='soubor.dat'; NOVYNAZEV='soubor.new'; VELBUF = 8192; KOD:longint = 1; var f,g:TDOSstream; buffer:array[1..VELBUF] of byte; n,i:longint; begin f.init(SOUBOR,stOpenRead); {pristup jen pro cteni} g.init(NOVYNAZEV,stCreate); {vytvori novy soubor} repeat n:=f.GetPos; {zaznamenam pozici ve streamu pred ctenim} f.Read(buffer,VELBUF); {pokusim se precist VELBUF bajtu} if f.status=stReadError then {nedoslo ke cteni za koncem souboru?} begin f.reset; {resetuj chybovy stav} n:=f.GetSize-n; {a zjisti, jak velky byl tento posledni usek} f.Read(buffer,n); {neni mi jasne, zda je to nutne. nic tim ale nezkazime} end else n:=f.GetPos-n; {o kolik bajtu jsme se soupli?} for i:=1 to n do inc(buffer[i],KOD); {zakoduju} g.Write(buffer,n); {a zapisu} until n<>VELBUF; {opakuj, dokud jsme nezpracovali cely soubor} f.Done; g.Done; writeln('Soubor ',SOUBOR,' zakodovan a ulozen do ',NOVYNAZEV,'.'); readln; end.Vidte, e metoda TStream.Write je podobn procedue BlockWrite a TStream.Read procedue BlockRead. Vidte ale, e metoda Read postrd parametr, kolik bajt se doopravdy peetlo. Proto si to musme sami, pomrn tkopdn, hldat.
uses Classes; {$R-,$O-} {pri kodovani nechci dostavat priblble chyby o} {preteceni/podteceni bajtu} const SOUBOR='soubor.dat'; NOVYNAZEV='soubor.new'; VELBUF = 8192; KOD:longint = 1; var f,g:TFileStream; buffer:array[1..VELBUF] of byte; n,i:longint; begin f:=TFileStream.Create(SOUBOR,fmOpenRead); {pristup jen pro cteni} g:=TFileStream.Create(NOVYNAZEV,fmCreate); {vytvori novy soubor} repeat n:=f.Read(buffer,VELBUF); for i:=1 to n do inc(buffer[i],KOD); {zakoduju} g.Write(buffer,n); {a zapisu} until n<>VELBUF; {opakuj, dokud jsme nezpracovali cely soubor} f.Destroy; g.Destroy; writeln('Soubor ',SOUBOR,' zakodovan a ulozen do ',NOVYNAZEV,'.'); readln; end.