Table of Contents

10 - Binární soubory

Cíle cvičení

Materiály

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);
int fclose( FILE *stream );

book.h

book.c

main.c

run

Z operační paměti do souboru

Poskytnutá knihovna pracuje s kolekcí struktur Book, která uchovává informace o jednotlivých svazcích. Naším úkolem je tuto kolekci uložit do (a načíst z) binárního souboru. Z paměťového hlediska chceme překopírovat bajty rozmístěné v operační paměti do sekvence (stream) bajtů reprezentované FILE.

Úkoly - Struktury a Stream bajtů

Úkoly - De/Serializace dynamicky alokovaných struktur

Použijte nově nabité znalosti k implementaci knihovny:

book_serializer.h

  1. Implementujte nejdřív serialize_book a deserialize_book. Podobně jako u předpřipravené funkce test_list_contents(), vytvořte si v main.c další testovací funkce pro serializaci a deserializaci.
  2. Funkce na serializaci jedné knihy a funkce z rozhraní book.h pak použijte v serialize_book_list a deserialize_book_list.

Pokročilé úlohy - Závislost na platformě

V Structure Layout se dočteme, že rozložení dat ve struktuře závisí na lokální platformě (typicky na HW architektuře (např. x86-64) a operačním systému). Ve struktuře mohou být vloženy úseky nevyužitého místa (padding), které zajistí, že jednotlivé prvky se nachází na tzv. zarovnaných adresách (dělitelných specifickou konstantou). Lišit se také může lišit pořadí bytů celočíselných hodnot (tzv, endianita).

Pokud budeme přesouvat data mezi různými platformami, musíme se “dohodnout” na společné reprezentaci, se kterou budou seznámeny obě strany. Pro komunikaci přes síť (např. v IP) bylo bajtové pořadí má být big-endian (tedy platforma která přijímá data ze sítě očekává big-endian). Počítače v laboratoři naopak používají little endian (tedy obrácené pořadí).

Úkolu

uint32_t le_to_be(uint32_t v);