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:

  1. 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.

  2. 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.

  3. 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.

  4. Do cyklu while doplňte tisk na konzolu (funkce putchar). Program přeložte a spusťte.

  5. 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.

  6. 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.

  7. 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.

  8. 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).

  9. 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.

  10. 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.

  11. 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.

  12. 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í:

  1. 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).

  2. 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.

  3. Ú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.

  4. 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