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:
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.
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.
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.
Tisk souboru na konzolu
Do cyklu while doplňte tisk
na konzolu (funkce putchar). Program přeložte a spusťte.
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.
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.
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.
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.
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
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í:
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 2018-02-12