Notice
This page is located in a preparation section till 23.09.2024.

10 - Binární soubory

Cíle cvičení

  • Ukládaní a načítání binárních souborů.
  • Serializace.

Materiály

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

  • Kód ke cvičení

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ů

  • 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 hexdump -C nebo otevřením ve VScode (vyberte Hex Editor).
  • Naplňte strukturu Book, uložte ji jako celek do binárního souboru a prohlédněte si obsah uloženého souboru. Hint
  • Zodpovězte si na následující otázky:
    • Ze souboru lze vyčíst hodnotu .title ale .abstract je nečitelná. Jak to? Hint
    • V souboru rozlište části reprezentující hodnoty atributů .year, .title a .abstract, odpovídá počet zapsaných bytů součtu velikostí jednotlivých atributů? Hint
  • Místo ukládání struktury jako celku, uložte hodnoty jejích atributů postupně v sérii.
    • Zařiďte ukládání řetězce .abstract, tak aby ji bylo možné načíst a přečíst. Uložení a načtení by mělo uchovat informaci zda-li .abstract=“” či .abstract=NULL. Řetězec může být libovolné délky.
    • Soubor zas načtěte do struktury a pro ověření vypište.
    • Diskutujte praktické rozdíly s ukládáním struktury jako celku.

Ú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 jsme se dočetli, že padding ve struct závisí na platformě. Reprezentace hodnot v paměti se ale může lišit i v pořadí bajtů, tzv. endianita.

  • 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 strukturu Book s možným přepínáním endianity.
  • Diskutujte, jak uložit hodnoty typu float nezávisle na architektuře.
courses/b0b36prp/labs/lab10.txt · Last modified: 2024/09/19 10:58 by faiglj