Formátovaný vstup dat



Procvičení načítání formátovaných dat, volání funkcí, předávání parametrů, 2D pole.



Zadání:

Napište program, který zobrazí data načtená ze souboru na disku. Jméno souboru s daty je předáno jako parametr příkazové řádky programu. Data se nacházejí v souboru ascii1.out nebo ascii2.out. Na každém řádku souboru jsou data pro jednu zobrazovanou pozici a jejich formát je následující:

(int_x_souřadnice,int_y_souřadnice)=uchar_hexa_hodnota

Tyto data udávají souřadnice ve čtvercové síti (bod 0,0 je vlevo nahoře) a hodnotu, která na daných souřadnicích leží. Hodnoty na pozicích reprezentují ASCII hodnoty znaků. Na pozicích, které nejsou v souboru uvedeny je znak mezera.

Příklad:
(0,10)=0x41
V prvním (0-tém) sloupci a jedenáctém (10-tém) řádku je umístěn znak s hexadecimální hodnotou 41 tj. znak 'A'

Projekt vypracujte v jediném zdrojovém souboru mainascii.c.



0. krok: Založte si nový projekt.


1. krok: Parametrem programu (funkce main) je název souboru s daty. Proveďte kontrolu přítomnosti názvu souboru v parametrech funkce main, soubor otevřete (zkontrolujte zda k otevření došlo) a zavřete. Při následném rozšiřování programu o další funkce, by k uvolnění zdrojů (zavření souboru, odalokování paměti ...) mělo dojít co nejdříve.


2. krok: Data ze souboru načtěte ve funkci NactiData(FILE* fr, unsigned char data[80][60], unsigned sloupcu, unsigned radku) do dvourozměrného pole typu char, které bude nadefinováno ve funkci main a bude parametrem funkce. Předpokládejte, že maximální rozměr pole může být 80x60 znaku (sloupce x řádky). (Funkce bude mít jako parametry (otevřený) soubor, rozměry pole, vlastní pole). Použijte formátované načítání fscanf. Výsledné pole je obdélníkové s větším rozměrem sloupců než řádků.


3. krok: Napište funkci, která načtená data vytiskne na obrazovku jako ASCII znaky, tak aby vznikl grafický obrazec daných rozměrů. Pole bude předáno jako parametr funkce, společně se svými rozměry. Zjistěte si, kolik znaků je možné vytisknout na řádek (pokud vytisknete znak na poslední místo v řádku monitoru, může dojít k automatickému pokračování na dalším řádku (je tedy lépe tisknout o znak méně a přechod na nový řádek zajistit pomocí vyslaného kódu).



4. krok: Dvourozměrné pole char Pole[80][60] nadefinované ve funkci main je uloženo na zásobníku a zabírá lineární paměťový prostor (i když se jedná o pole dvourozměrné, zabírá v paměti za sebou jdoucí byty tak, že data dalšího řádku následují ihned za předchozím).
Napište funkci, která bude provádět stejnou činnost jako funkce v kroku 3, ale funkce bude mít jako parametry rozměry pole a pole bude předáno pouze jako ukazatel na první prvek pole (tj. TYP *pole). K prvkům v dvourozměrném poli se tedy bude přistupovat pomocí jednoho indexu – pozice ve dvourozměrném poli se přepočítá na pozici v jednorozměrném poli, ve kterém budou řádky za sebou.

















Poslední úpravy 2018-02-19