Vypuštění komentářů
Zadání:
Napište program, který vypustí komentáře ze souboru a výsledek zapíše do jiného souboru.
Program vyřešte pomocí stavového automatu (příkaz switch, jako stavy použijte „textových“ hodnot enum nebo #define)
Komentáře předpokládejte v obou tvarech (tj. „/* */“ i „ // “ ).
Název vstupního i výstupního souboru je předán jako parametr při spuštění programu.
Pro vyhodnocování použijte stavový automat realizovaný za pomoci klíčového slova switch.
Při otevírání souborů otestujte, zda se otevření zdařilo
otevřené soubory zavřete
Nápověda:
příkaz switch realizuje větvení na základě celočíselné proměnné reprezentující akuální stav programu. Celočíselnou proměnnou může být kód stavu, ve kterém se nachází vyhodnocování. Podle aktuálně načteného znaku ze souboru se stav může změnit. Těmito stavy může například být:
TEXT – jsme uprostřed textu, který se kopíruje na výstup (objeví-li se lomítko, je nutno se přepnout do stavu, kdy lze očekávat komentář – lomítko se na výstup nezapíše)
LOMITKO – minulý znak bylo lomítko (podle aktuálního znaku poznáme, zda se jedná o /*, // nebo skutečně o lomítko
C_KOMENT – jsme uvnitř komentáře /*, hvězdička je potencionální konec
HVEZDICKA – je-li aktuálně lomítko, končí komentář, je-li to jiný znak, vracíme se do C_KOMENT
CPP_KOMENT – jsme uvnitř řádkového komentáře – končí koncem řádky (pak je TEXT)
…
Doporučený postup řešení:
v nastavení projektu (pravé tlačítko na kořenovém řádku souborů projektu – FileView, potom settings a program arguments) napište názvy vstupního a výstupního souboru. Používejte názvy souborů, které nejsou součástí projektu. Mohlo by dojít ke kolizím při otevírání souborů.
Funkce main by měla mít parametry argc a argv. Vytiskněte je.
Pokuste se otevřít a zavřít vstupní a výstupní soubor. Otestujte, zda se operace povedly. (Otevření proveďte v textovém modu. K otevření použijte funkci fopen, k zavření fclose. Operace se povedla, pokud fopen nevrátí NULL.).
Zkuste soubor pouze překopírovat. (použijte fgetc a fputc. Obě funkce se chovají tak, že se posunou o znak. To je „ znak se pošle do linky a zmizí.“)
Naprogramujte stavový automat.
Pro pokročilé
Doplňte program tak, aby řešil i:
- situaci, kdy se znak pro komentář objeví v řetězci? Např.: printf(“Komentář se píše takto: /* tady je komentář */ nebo takto: // tady je \“řádkový\“ komentář “);
- situaci, kdy by se nemělo objevit více prázdných řádků za sebou (např. Vypuštěných 10 jednořádkových komentářů za sebou bez kódu C). Lze zkusit i jako druhý program a následné zřetězení pomocí roury (neboli pipe). (příklad volání kom_destr.exe <zdroje.cpp | radky_destr.exe >zdroje_vyst.cpp)
Poslední změna: 2007-10-05