Práce se soubory (2018)



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.



Promyslete se tvorbu programu. Začněte vývojovým diagramem (např.):

první úroveň:

0. názvy souborů zadány do řetězců
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: otevři první soubor - otestuj že se povedlo - pokud ne vypiš zprávu a ukonči
b: 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. Vytvoření projektu a definice jmen souborů
    Založte projekt kopiruj s jedním souborem kopiruj.c.
    Nadefinujte funkci main a v ní proměnné fr, fw typu FILE* pro vstupní (fr) a výstupní (fw) soubor. Pro jména vstupního a výstupního souboru (pro úvodní fázi) nadefinujte proměnné Vstup, Vystup typu řetězec (textová pole) s názvy souborů (zdroj.txt, vystup.txt). 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ření vstupního datového souboru, jeho otevření a zavření.
    Vytvořte si vstupní soubor zdroj.txt (předpokládáme práci s textovými soubory) na disku v adresáři, ve kterém je zdrojový soubor programu (kopiruj.c) – tento adresář je aktuálním adresářem při ladění programu.
    Otevřete vstupní soubor pro čtení (v textovém modu) a proveďte ošetření neúspěšného otevření. Pokud se nepodaří soubor otevřít, vytiskněte chybovou zprávu a program ukončete s kódem 2. (Ověřte funkci tohoto ošetření pokusem o otevření neexistujícího souboru.)
    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. Zjištění počtu znaků v souboru
    Zjistěte počet znaků v souboru pomocí načítání jednotlivých znaků.
    Proveďte pomocí cyklu while, ve kterém budete načítat postupně znaky ze souboru (fgetc). Pro testování dosažení konce souboru použijte funkci feof.
    Při načítání zjistěte počet znaků v souboru a vytiskněte jejich počet. Program přeložte a spusťte.
    Pozn.: Zkuste soubor otevřít v binárním módu a porovnat výstup a počet znaků s otevřením v textovém režimu.

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

  5. Tisk na konzolu pomocí (streamové) funkce fputc
    Pro výstup na monitor (konzolu) a do souboru se používá stejný mechanizmu. Funkce tisku na konzolu je stejná jako tisk do souboru, pouze je implicitně dán název výstupu stdout (otevřený výstup typu FILE* propojený s konzolou). Díky tomuto mechanizmu je možné tisknou stejným kódem na konzolu a do souboru – pouze se dodá jiná proměnná streamu (FILE *).
    Upravte kód z bodu 4 tak, aby se pro tisk na konzolu použila souborová funkce (fputc) s argumentem stdout. Program přeložte a spusťte.

  6. Překopírujte (vytiskněte) načítaný soubor do souboru
    Otevřete soubor pro uložení kopie. Mod otevření souboru zvolte tak, že se otevře pokud neexistuje – pokud existuje, pak se otevření neprovede (nechceme přepsat stávající data).
    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 s hodnotou 3 – 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. Při dalším spuštění by měla být zahlášena chyba existence souboru, pokud soubor nesmažeme.

  7. Vytvoření funkce pro kopírování souborů
    Program pro kopírování rozdělte tak, aby otevření, zavření a příslušné kontroly byly v main a pro vlastní kopírování souboru vytvořte funkci KopirujSoubor (bude mít dva parametry typu FILE*, přesuňte do něj kód kopírování z funkce main). Program přeložte a spusťte.

  8. Kopírovací funkce v samostatném modulu (zdrojový a hlavičkový soubor)
    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.

  9. Využití kopírovací funkce s předdefinovanými streamy – stdin, stdout
    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).
    Pozn.: při použití stdin, stdout nepoužívejte fclose

  10. Zjištění počte řádků v souboru
    Napište funkci PocetRadku, která bude mít jeden parametr – otevřený soubor. Funkce bude vracet počet řádků (tj. znaků konců řádků) v souboru. Ve funkci main zavolejte funkci PocetRadku a vytiskněte počet řádků v souboru na konzoli.
    Pozn.: pokud použijete stejný vstupní soubor jako v minulých bodech, nezapomeňte, že jste dosáhli konce souboru a musíte se přesunout na začátek (funkce rewind).



Pozn.: Po probrání parametrů funkce main zkuste příklad rozšířit o zadání názvů souborů jako parametrů programu na příkazové řádce.

1) Názvy obou souborů budou zadány jako parametr programu na příkazové řádce:
C:\xxxxx\:>>kopiruj.exe zdroj.txt cil.txt.

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

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

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



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 2018-02-12