{{indexmenu_n>11}} ====== 11 - Binární soubory ====== * pro vyučující: [[courses:b0b36prp:internal:tutorialinstruction:11|]] * Funkce: FILE *fopen(const char *path, const char *mode); size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); ===== Úkoly ===== * Načtěte ze vstupu seznam čísel a uložte je do binárního souboru. Poté soubor načtěte a vypište seznam čísel. Prohlédněte si uložený soubor programem ''xxd'' nebo ''hexdump -C''. * Naplňte strukturu ''test'', uložte ji do binárního souboru, binární soubor načtěte do struktury a její obsah vypište. struct test { int ival; char cval; }; typedef struct test test_t; * Totéž udělejte se strukturou ''test2'', do které uložíte i pointer na řetězec. Zamyslete se, jak správně uložit řetězec v položce ''.str'', jak ho správně načíst a jak rozlišit, zda ''.str'' obsahuje NULL nebo odkaz na prázdný řetězec. struct test2 { int ival; char cval; char *str; }; typedef struct test2 test2_t; * Udělejte totéž s polem struktur ''test'' a ''test2''. * Jak to bude, pokud použijete atribute ''packed''? Jak se změní velikost struktury a proč? Musíte něco změnit ve vašem kódu? Jak ukládání a načítání naprogramovat, aby byl nezávislý na tomto atributu? __attribute__((packed)) * Naprogramujte funkce ''le_to_be()'', která převede integer z little endian na big endian. (Pro uint32_t budete potřebovat ''stdint.h''.) uint32_t le_to_be(uint32_t v); * Nyní uložte a načtěte struktury ''test'' a ''test2'' nezávisle na architektuře. Diskutujte limity vašeho řešení. * Diskutujte, jak uložit hodnoty typu ''float'' nezávisle na architektuře. ---- * Načítejte čísla ze stdin a postupně je ukládejte do BST. Nakonec vyhledejte některá čísla a vypište, kolik kroků bylo potřeba k vyhledání. * Výsledný BST pravděpodobně není vyvážený. Jak upravíte načítání, aby byl strom vyvážený? * Pokud jste použili strukturu z přednášky, napadá vás, jak tuto úlohu vyřešit úsporněji bez pointerů ''.left'' a ''.right''?