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);
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))
uint32_t le_to_be(uint32_t v);
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?