[ TuT ] Práce se soubory

Sekcia určená pre programovací jazyk pawn.

[ TuT ] Práce se soubory

Poslaťod Iron[CZ] » Str 20. Júl 2011 16:49:08

Používání souborů
Tento tutoriál pojednává o vytváření souborů, čtení z nich a celková práce s nimi.

K čemu jsou dobré soubory?
V případě že potřebujete nějaká data uložit na delší dobu, než je restart serveru, je třeba data uložit někam, kde se nebudou mazat po restartu. Variantou jsou externí soubory, které jsou uloženy na serveru ve složce scriptfiles. Používají se hlavně pro ukládání hráčových statistik - k tomu byly vytvořeny speciální funkce primárně určené pro ukládání proměnných pro hráče. Mezi tyto funkce patří hlavně DUTILS, DUDB a DINI. My se však těmito funkcemi nebudeme zabývat.

Vytváření souborů
Soubor lze vytvořit pomocí funkce fopen. Syntaxe vytvoření je tato:
Kód: Vybrať všetko
new File:Soubor

File je druh proměnné určené pro soubory.
Kód: Vybrať všetko
Soubor = fopen("nazevsouboru", způsob);

Funkce fopen otevře soubor, pokud tento soubor neexistuje, je vytvořen. Příponami souboru se moc nezdržujte, můžete vlastně použít jakoukoli příponu, nicméně doporučuji zůstat u klasických txt, ini, cfg.... Dalším parametrem funkce je způsob. To značí, jestli budeme ze souboru číst, zapisovat do něj atd. Varianty jsou tyto:
  • io_read - toto použijeme, chceme-li ze souboru přečíst nějaké data. Pokud soubor neexistuje, spadne server!
  • io_write - toto přepíše všechen obsah souboru.
  • io_readwrite - stejné jako io_read, ale když soubor neexistuje, je vytvořen.
  • io_append - tato funkce otevře soubor, ale nepřepíše jeho obsah, pouze připisuje daný text na konec.
Na konci práce se souborem nezapomeneme server zavřít. To provedeme funkcí fclose.
Kód: Vybrať všetko
fclose(proměnná souboru);


Zapisování do souborů
Teď se naučíme zapisovat do souboru pomocí funkce fwrite. Takže začneme vytvořením nového souboru:
Kód: Vybrať všetko
new File:Soubor = fopen("text.txt", io_append);

A zapíšeme libovolný text:
Kód: Vybrať všetko
fwrite(Soubor, "ahoj\n");

\n znamená, že se začne zapisovat na novém řádku, jinak by byl soubor jeden velký řádek a ztratil by přehlednost zápisu.
Nakonec soubor zase zavřeme:
Kód: Vybrať všetko
fclose(Soubor);

Velice jednoduché. Můžeme samozřejmě zapisovat i řetězce s proměnnými.
Kód: Vybrať všetko
new string[50];
format (string, sizeof(string), "Hrac %s vola ahoj\n", PlayerName(playerid));
fwrite(Soubor, string);

Do zápisu nedoporučuji používat diakritiku, která se nezobrazuje. Zobrazí se divné znaky nad písmeny.

Čtení ze souboru
Nyní se naučíme číst ze dříve vytvořeného souboru. K tomu použijeme funkci fread. Jak se nakonec dozvíme, tato funkce má některé nevýhody. Jdeme na to, začneme základem:
Kód: Vybrať všetko
new File:Soubor = fopen("text.txt", io_read);
new string[50];
fread(Soubor, string, sizeof(string));
fclose(Soubor);

Nyní řetězec string má obsah 'ahoj'. Nevýhodou je, že funkce čte pouze první řádek souboru. Pokud máme soubor s více řádky, musíme si pomoci.
Kód: Vybrať všetko
new File:Soubor = fopen("text.txt", io_read);
new string[50];
while(fread(Soubor, string))
{
   if (strcmp.......)
}
fclose(Soubor);

Zde použijeme cyklus while, který se opakuje dokud se nedojde na konec souboru. Pokud chceme přečíst celý soubor s pak ho odeslat najednou, můžeme to udělat třeba pomocí funkce strcat.

Odstranění souboru
Najde se i chvíle, kdy potřebujeme odstranit některý soubor a nemůžeme to provést manuálně. Použijeme proto funkci fremove. Má jednoduchou syntaxi:
Kód: Vybrať všetko
fremove(jméno souboru);

Musíte si dát pozor, aby soubor existoval a aby nebyl v době odstraňování otevřen.

Zapisování a čtení souboru v binárním formátu
Funkce fblockwrite zapisuje data v binárním formátu a ignoruje konec řádku a kódování.
Kód: Vybrať všetko
fblockwrite(soubor, "Ahoj jak se máš", délka);

Naproti tomu je stejná funkce fblockread, která pro změnu čte v binárním formátu bez kódování.
Kód: Vybrať všetko
fblockread(soubor, string, délka);

Tyto funkce zde nebudu rozebírat dopodrobna, jelikož je stejně moc nevyužijete.

Další funkce pro práci se soubory
fseek
Další funkce kterou nevyužijete. Mění aktuální pozici kurzoru v souboru, respektive určí odkud se bude zapisovat.
Kód: Vybrať všetko
fseek(soubor, pozice, odkud);

Odkud může nabývat těchto hodnot:
  • seek_start - začátek
  • seek_current - aktuální pozice
  • seek_end - konec
Pro zajímavost vám sem napíšu ještě funkce, které nikdy nevyužijete: mezi ně patří fmatch, fputchar, ftemp.

Složky
Poslední částí budou užitečné věci, kterými jsou složky. V případě toho, že máte na serveru spoustu souborů, se uplatní je roztřídit do složek podle informací. V následujícím příkladu otevřeme soubor ahoj.txt ve složce testy.
Kód: Vybrať všetko
new File:Soubor = fopen("/testy/ahoj.txt", io_append);

Samozřejmě složek může být i víc a mohou být i v sobě. Tudíž můžete udělat třeba toto:
Kód: Vybrať všetko
new File:Soubor = fopen("/testy/zkousky/ahoj/ahoj.txt", io_append);

Jedinou nevýhodou složek je skutečnost, že musí být ručně vytvořeny na serveru. Pokud spustíte server a složky nejsou vytvořeny, server spadne. Tímto končím svůj druhý tutoriál a doufám, že jste se zase něco naučili.
Naposledy upravil Iron[CZ] dňa Štv 21. Júl 2011 11:38:58, celkovo upravené 1
Obrázok užívateľa
Iron[CZ]
Nováčik
Nováčik
 
Príspevky: 125
Registrovaný: Pon 19. Júl 2010 20:56:53
Bydlisko: Týniště nad Orlicí

Re: [ TuT ] Práce se soubory

Poslaťod KarTooN » Str 20. Júl 2011 17:01:46

výborně  8) karma +
Obrázok
KarTooN
Super člen
Super člen
 
Príspevky: 1320
Registrovaný: Pon 27. Jún 2011 9:49:07
Bydlisko: Opava
Obľúbený server?: PTPM

Re: [ TuT ] Práce se soubory

Poslaťod Rytmus » Štv 21. Júl 2011 13:16:11

Dávam K+. Fakt pekne :)
Víťaz Netopeer Awards v kategórii - Administrátor roka 2013.

Obrázok
Obrázok
Obrázok užívateľa
Rytmus
NTP Member
NTP Member
 
Príspevky: 2115
Registrovaný: Sob 16. Jan 2010 23:41:12
Bydlisko: Myjava

Re: [ TuT ] Práce se soubory

Poslaťod Angel » Štv 21. Júl 2011 13:21:37

Pekné, Karmu až keď budem môcť, už som o týchto funkciach čítal, možno až na fseek, fblockwrite, fblockread.
Angel
 


Späť na Pawn

Kto je on-line

Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 0 hostia

cron