Práce se soubory
Kopie souborů
Napište program, který překopíruje soubor ze zdrojového do cílového souboru. Pokud cílový soubor existuje, vypíše hlášení a kopii neprovede. Názvy obou souborů budou zadány jako parametr programu na příkazové řádce: C:\xxxxx\:>>kopiruj.exe zdroj.txt cil.txt.
Začněte vývojovým diagramem (např.):
první úroveň:
0. názvy souborů dodány jako parametr
1. úvod - inicializace -
kontrola parametrů, otevření souboru a kontrola zda se povedlo
2.
vlastní činnost - funkce se 2 parametry - otevřené soubory
3.
zavření souborů - test zda se povedlo
druhá úroveň:
inicializace:
a: jsou přítomny tři paramery? -pokud ne - vypiš zprávu a
ukonči
b: otevři první soubor - otestuj že se povedlo - pokud ne
vypiš zprávu a ukonči
c: otevři druhý soubor - otestuj že se
povedlo - pokud ne vypiš zprávu,zavři první soubor a ukonči
vlastní činnost: parametry - vstupní a výstupni stream
a: načti znak ze vstupu
b: pokud je znak neplatný (je konec
souboru) skonči
c: udělej činnost - ulož znak do vystupu, vyplň
statistiku …
d: načti znak ze vstupu
e: pokračuj od b)
Pokračovat až do úrovně příkazů programu
Postup řešení na PC:
Nadefinujte si funkci main a v ní proměnné pro vstupní a výstupní soubor. Pro jména vstupního a výstupního souboru si (pro úvodní fázi) nadefinujte textová pole (řetězce) s názvy souborů. Názvy vstupního a výstupního souboru vytiskněte na konzolu. Načtěte (include) příslušné knihovny nutné pro překlad. Program přeložte a spusťte.
Vytvořte si vstupní soubor zdroj.txt na disku (předpokládáme práci s textovými soubory). Otevřete vstupní soubor pro čtení a proveďte ošetření neúspěšného otevření. Vytiskněte zda se otevření povedlo nebo ne. Pro každý otevřený soubor musí existovat jeho zavření – zavřete soubor na konci programu. Program přeložte a spusťte.
Pomocí cyklu while, ve kterém budete načítat postupně znaky ze souboru (getch) a testování dosažení konce souboru funkcí feof zjistěte délku souboru – délku vytiskněte. Program přeložte a spusťte.
Do cyklu while doplňte tisk na konzolu (funkce putchar). Program přeložte a spusťte.
Pro výstup na monitor (konzolu) je předdefinovaný „soubor“/stream (s názvem proměnné) stdout. Zapište tuto hodnotu do proměnné pro výstupní soubor a tisk z bodu 4 změňte tak aby se tisklo do výstupního streamu (pomocí použití příslušné proměnné) místo příkazu pro tisk na konzolu. Program přeložte a spusťte.
Nyní připravte výstupní stream podle jména (souboru). Soubor je nutné otevřít pokud neexistuje – pokud existuje, pak se otevření neprovede. Proveďte otevření a vypište zprávu o výsledku na monitor. V případě, že se nepovedlo soubor otevřít, program ukončete – nezapomeňte, že je již otevřen vstupní soubor, který je nutné uzavřít (před každým ukončením programu – před každým returnem v main). Stejně tak je nutné zavřít na konci programu výstupní soubor v případě, že se ho podařilo otevřít. Program přeložte a spusťte. V případě správnosti by měla být po ukončení programu ve výstupním souboru kopie souboru vstupního.
V nastavení parametrů prostředí překladače najděte zadání
argumentů (tj. textu, který bude vložen na příkazovou řádku za název
volaného souboru a dostane se do programu jako parametr funkce main.
Parametry lze nastavit sekci debuger – argumenty.
Při
volání kopiruj.exe zdroj.txt cil.txt se do argumentů uvede zdroj.txt
cil.txt.
Prototyp funkce main bude int main(int Pocet_parametru,
char *text[]).
Pro nás tedy budou tři parametry – název
spouštěného souboru, dosažitelný pomocí text[0], název vstupního
souboru dosažitelný přes text[1] a název výstupního souboru
dosažitelný přes text[2].
Nastavte parametry v prostředí, upravte
hlavičku funkce main a na začátku programu vytiskněte počet a názvy
zadaných proměnných. Program přeložte a spusťte.
Zkuste najít v adresářové struktuře překládaný exe soubor a spustit ho s příkazové řádky společně s názvy souborů (servant salamandr, nebo spustit konzolu pomocí příkazu cmd).
Vyměňte jména otevíraných souborů z definovaných řetězců z bodu 2) na názvy souborů předané z příkazové řádky. Před pokusem o otevření zahlaste chybu, pokud na řádku nebude správný počet parametrů. Program přeložte a spusťte.
Program pro kopírování rozdělte tak, aby otevření, zavření a kontroly byly v main a pro vlastní kopírování souboru vytvořte funkci (bude mít dva parametry typu FILE*). Program přeložte a spusťte.
Funkci pro kopírování přesuňte do samostatného zdrojového souboru. Vytvořte příslušný hlavičkový soubor – nezapomeňte na ošetření vícenásobného načtení. Soubor naincludujte do obou zdrojových souborů. Program přeložte a spusťte.
Zkuste co se stane v případě, že do funkce pro kopii pošlete na místě vstupního souboru proměnnou stdin, nebo na místě výstupního stdout (v různých kombinacích i s otevřenými soubory).
Zjištění statistiky znaků v souboru
Napište program, který vypíše tabulku ASCII hodnot znaků, jejich absolutní počet a jejich procentní zastoupení v souboru. Vyjděte z programu pro kopii souborů s tím, že bude dodán ještě další parametr na řádku a to počet procent – tisknout se budou jen znaky, které přesáhnou tuto hranici.
Postup řešení:
Vyjděte z programu pro kopírování souborů. Pokud budete v tomto programu pokračovat, nezapomeňte, že jste již dosáhli konce souboru a proto se musíte vrátit na začátek (alternativy (která je nejlepší?): zavření a nové otevření, funkce fseek, funkce rewind).
V main vytvořte proměnné pro statistiku (pole celých čísel o délce rovné počtu znaků – pro každý výskyt znaku se pozice odpovídající jeho ASCII hodnotě zvýší o jedna). Dále vytvořte proměnnou pro limit procent a naplňte ji nulou nebo hodnotou dodanou z příkazové řádky.
Úpravou funkce pro kopii naplňte pole statistiky. Funkce bude mít navíc parametr pole statistiky. Nebude tisknout do výstupu (a tedy nebude mít jako parametr výstupní soubor), pouze „projede“soubor a naplní pole počty znaků. Program přeložte a spusťte.
Napište funkci, které předáte pole statistiky, limit procent a název výstupního streamu. Funkce bude procházet tabulku a pokud znak přesáhne daný limit procent, bude vytištěn do streamu ve formátu – ASCII kód znaku (hexa), počet znaků, procent. Program přeložte a spusťte.
Poslední změna 2014-03-17