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: Ve funkci:
a) NactiData(FILE* fr,
unsigned sloupcu,unsigned radku, unsigned char data[80][60]) pro
překlad volbou VS.
b) NactiData(FILE* fr, unsigned sloupcu,
unsigned radku, unsigned char data[sloupcu][radku]) pro překlad
volbou Clang. Zde se používá možnosti lokálního pole s proměnnou
délkou, která je nepovinnou součástí normy a proto nemusí být v
překladači implementována (což se u VS děje). Implementaci
signalizuje proměnná __STDC_NO_VLA__, která nastavená na 1
znamená, že pole s proměnnou délkou nejsou implementovány.
načtěte ze souboru data 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ů.
Funkce vrátí nulu v případě, že se dosáhlo bez chyby konce souboru,
jinak vrátí hodnotu 1.
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