Warning: Declaration of action_plugin_subjectindex_indexer::register(&$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/subjectindex/action/indexer.php on line 15

Warning: Declaration of action_plugin_mathjax_enable::register(Doku_Event_Handler &$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/mathjax/action/enable.php on line 62

Warning: Declaration of action_plugin_googleanalytics::register(&$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/googleanalytics/action.php on line 40

Warning: Declaration of action_plugin_folded::register(&$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/folded/action.php on line 40

Warning: Declaration of action_plugin_hidden::register(&$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/hidden/action.php on line 28

Warning: Declaration of action_plugin_include::register(&$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/include/action.php on line 354

Warning: Declaration of action_plugin_tag::register(&$contr) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/tag/action.php on line 175

Warning: Cannot modify header information - headers already sent by (output started at /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/subjectindex/action/indexer.php:15) in /data/web/virtuals/28604/virtual/www/subdom/bo/inc/auth.php on line 532

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /data/web/virtuals/28604/virtual/www/subdom/bo/inc/auth.php on line 818

Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /data/web/virtuals/28604/virtual/www/subdom/bo/inc/parser/handler.php on line 1376

Warning: Declaration of SI_EntryDefault::match($text) should be compatible with SI_Entry::match() in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/subjectindex/plugins/EntryDefault.php on line 68

Warning: Declaration of SI_EntryTag::match($text) should be compatible with SI_Entry::match() in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/subjectindex/plugins/EntryTag.php on line 42

Warning: Declaration of SI_EntryVerse::match($text) should be compatible with SI_Entry::match() in /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/subjectindex/plugins/EntryVerse.php on line 1280

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4360 in /data/web/virtuals/28604/virtual/www/subdom/bo/inc/parser/lexer.php on line 118
A PCRE internal error occured. This might be caused by a faulty plugin

Warning: Cannot modify header information - headers already sent by (output started at /data/web/virtuals/28604/virtual/www/subdom/bo/lib/plugins/subjectindex/action/indexer.php:15) in /data/web/virtuals/28604/virtual/www/subdom/bo/inc/actions.php on line 215
jazykc:prace-s-binarnimi-soubory [Bo.bule]

====== Práce s binárními soubory ====== * [[dox>prace-s-binarnimi-soubory/jednotkove-vektory.c|Jednotkové_vektory]] * [[dox>prace-s-binarnimi-soubory/database-osob.c|Databáze_osob]] Veškeré níže uvedené funkce je možné použít také s textovými soubory, mnohem častěji se však v praxi využívají u souborů binárních. ======Čtení bloku dat: fread====== Hlavička funkce [[die.net>3/fread]] <code c> size_t fread(void *kam, size_t rozmer, size_t pocet, FILE *fr); </code> kde * //fr// je datový proud, ze kterého se čte, * //rozmer// je velikost jedné čtené položky, * //pocet// udává počet položek a * //kam// je adresa, kam se úspěšně přečtená data uloží. Funkce vrací počet úspěšně přečtených položek. Příklad: <code c> #define VELIKOST_BLOKU 10 ... int data[VELIKOST_BLOKU]; FILE *fr = fopen("in.dat", "rb"); fread(data, sizeof(int), VELIKOST_BLOKU, fr); </code> ======Zápis bloku dat====== Hlavička funkce: <code c> size_t fwrite(void *odkud, size_t size, size_t nmemb, FILE *fw); </code> kde * //fw// je datový proud, do kterého se zapisuje, * //size// je velikost jedné zapisované položky, * //nmemb// udává počet položek a * //odkud// je adresa, kde jsou zapisovaná data uložena ([[promenna#buffer]]). Funkce vrací počet úspěšně zapsaných položek. Příklad: <code c> #define VELIKOST_BLOKU 10 ... int data[VELIKOST_BLOKU]; FILE *fw = fopen("out.dat", "wb"); ... fwrite(data, sizeof(int), VELIKOST_BLOKU, fw); </code> ======Posun pozice v souboru====== V některých situacích je třeba číst (resp. zapisovat) data z (resp. do) konkrétního místa souboru. Toto nám jazyk C umožňuje řešit pomocí posouvání "ukazatele" na aktuálně zpracovávanou pozici daného souboru. Hlavička funkce [[die.net>3/fseek]] pro posun v souboru: <code c> int fseek(FILE *f, long offset, int odkud); </code> kde * //f// je daný soubor, * //offset// udává počet bytů (může být i záporné číslo), o kolik se chceme posunout směrem ke konci souboru, * //odkud// udává pozici v souboru, ke které se bude zamýšlený posun vztahovat. Parametr odkud může nabývat těchto hodnot: * SEEK_SET (pro posun od začátku souboru), * SEEK_CUR (pro posun od aktuální pozice) a * SEEK_END (posun od konce souboru). Funkce vrací nulu v případě úspěchu a nenulovou hodnotu, pokud nastala chyba. Hlavička funce pro zjištění pozice: <code> long ftell(FILE *f); </code> kde f je daný soubor. Funkce vrací aktuální pozici odpovídající velikosti posunu od začátku souboru v bytech. Příklad: <code c> /* navrat na puvodni misto */ akt_pos = ftell(f); fseek(f, 0L, SEEK_SET); if (hledej(f, "ahoj") == NULL) fseek(f, akt_pos, SEEK_SET); </code> Pokud v programu zapisujeme a čteme z téhož souboru, je potřeba si uvědomit, že z technických důvodů nesmí žádná vstupní operace (např. volání fread) následovat přímo po výstupní operaci (např. volání fwrite) a naopak, bez předchozího volání funkce fseek. Pokud není potřeba měnit pozici v souboru, lze pomocí funkce realizovat posun o 0 bytů (např. fseek(f, 0L, SEEK_CUR);). ---- cc,upol


Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /data/web/virtuals/28604/virtual/www/subdom/bo/inc/auth.php on line 818
jazykc/prace-s-binarnimi-soubory.txt · Last modified: 2015/01/15 20:48 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0