Nechýbajú teda funkcie na výpis do súboru, načítavanie zo súboru po rôzne veľkých blokoch dát a práca s bufferom – blok pamäte využívaný pre načítavanie alebo zapisovanie ešte predtým, ako sa dáta fyzicky zapíšu do súboru.
Základné – Standard vstupy/výstupy
Súbor stdio.h definuje aj tri základné dátové toky. Dva výstupne, jeden vstupný.
stdout – je výstup, ktorý je používaný pri tvorbe konzolových aplikácii a jeho základnou funkciou sú printf.
stderr – obsahuje chybové hlásenia pre rôzne chyby súvisiace s otváraním súborov a prístupu k nim.
stdin – je to vstup, ktorý je vstupom z klávesnice, ale podobne ako všetky zmieňované štandardné dátové toky, je možné ich funkciou freopen( ) presmerovať.
Symbolické konštanty a piliere
EOF – End Of File
Toto je špeciálna hodnota, ktorá je vracaná niekoľkými funkciami, ktoré načítavajú dáta zo súboru. Na konci každého textového súboru sa nachádza táto hodnota a určuje, pokiaľ sa nachádza vlastný obsah súboru. Táto kvázi symbolická konštanta je nesmierne dôležitá, pretože podľa nej vieme, kde je koniec súboru a pokiaľ máme načítavať dáta.
Pozícia v súbore
Jedná sa o interný pointer, ktorý poukazuje na aktuálnu pozíciu v súbore. Pri načítavaní sa pozícia mení podľa funkcie, ktorú používame a jednoducho povedané, je to akýsi ukazovateľ na pozíciu v súbore. Je to tiež základ pre vykonávanie procesu načítavania. Táto pozícia sa dá zistiť alebo meniť niekoľkými funkciami, ktoré si predstavíme nižšie v druhom dieli stdio.h.
Error indikátor
Indikuje chybu pri načítavaní výpise a podobne. Funkcia perror ho zistí a vypisuje a funkcia clearerr ho odstraňuje a vracia na nechybovú hodnotu.
Základné funkcie
Otvorenie súboru – fopen( )
Táto funkcia otvorí, alebo ak neexistuje, vytvorí súbor s daným názvom. Druhý parameter udáva, v akom móde sa má súbor otvoriť. O tomto sme už raz hovorili v 13. dieli C++ programovania – práca so súbormi I.Príklad
FILE *f;
f = fopen("C:\diel26.txt","w");
Zatvorenie súboru – fclose( )
Táto funkcia zatvorí súbor. Táto funkcia zapíše do súboru aj všetky dáta načítané v bufferi. Je dôležité s ňou pracovať, ak chceme v programe so súborom pracovať vo viacerých funkciách. Po ukončení práce so súborom v každej funkcii je nutné zatvoriť súbor, aby bol použiteľný pre opätovné otváranie.Príklad
fclose(f);
Presmerovanie výpisu stdout, stderr, alebo znovu otvorenie súboru freopen( )
Výpis stdout je klasický výpis do konzole, ktorý poznáme s jazyka C a funguje samozrejme aj v C++, ak vytvárame konzolovú aplikáciu. Funkcia freopen( ) sa v prvom rade snaží zatvoriť všetky otvorené súbory s ktorými program pracuje. Potom otvorí súbor, ktorého meno je zadané, v zadanom móde a presmeruje do neho zadané parametre. Presmerovanie sa netýka len štandardných konzolových výpočtov. Pri práci so súbormi sa toto tiež dá ľahko využiť pre rýchle presmerovanie výpisu, resp. že zmeníme cieľ výpisu do iného súboru. Uvedieme si dva príklady. Jeden presmeruje výpis stdout a druhý presmeruje výpis z jedného súboru do druhého.Príklad1
freopen ("C:\vypis.txt","w",stdout);
printf ("Táto veta je z konzole presmerovaná do súboru");
fclose (stdout);
Príklad2
FILE *f;
f = fopen("C:\novy.txt","w");
fprintf(f,"ahoj");
freopen ("C:\presmerovany.txt","w",f);
fprintf (f,"Táto veta je presm. do iného súboru");
fclose (f);
Vymazanie remove( ) a premenovanie súboru rename( )
Na vymazanie súboru slúži funkcia remove (). Táto funkcia vracia hodnotu 0, ak bolo vymazanie úspešné, t.j. ak bol súbor nájdený, a ak k nemu môže program pristúpiť a vykonať proces zmazania. Ak nebola splnená jedna z týchto podmienok,Príklad
remove("C:\diel26.txt");
Na premenovanie máme z palety funkcii hlavičkového súboru stdio.h funkciu rename( ). Funkcia rename( ) nielenže dokáže premenovať súbor, ale ho aj premiestniť. Ukážeme si dva príklady, z ktorých prvý bude len premenovávať a druhý aj premenuje aj premiestni. Pred oboma príkladmi, však treba mať pripravený textový súbor – test.txt, ktorý budeme presúvať. V prvom prípade v adresári, kde máme uložený projekt, v druhom na disku C, alebo resp. po úprave kóde kde chcete.
Príklad1
char staremeno[20];
char novemeno[20];
strcpy(staremeno,"test.txt");
strcpy(novemeno,"premenovany.txt");
rename( staremeno , novemeno ); //proces premenovania
Dôležité je si uvedomiť, že názov, ktorý má súbor v tomto prípade obsahuje aj adresárovú cestu. Čiže ak nezadáme žiadnu cestu, iba rovno meno súboru, tak ho bude program hľadať v adresári uloženého C++ projektu. Pred oboma testami
Príklad2
char staremeno[50];
char novemeno[50];
strcpy(staremeno,"C:\test.txt");
strcpy(novemeno,"C:\mojadresa\presunuty.txt");
rename( staremeno , novemeno );
Ďalšia vec je, že ak premiestňujeme súbor, tak adresár, do ktorého súbor umiestňujeme už musí existovať. Program ho nevytvorí.
Načítavanie a jeho možnosti
Táto časť je veľmi široká, pretože stdio.h obsahuje viac ako 10 funkcii na načítavanie. Líšia sa tým, že napríklad jedna načítava celý riadok, jedna po reťazcoch, iná po znakoch, alebo po rôznych dátových typoch a podobne. Začneme od načítavania po najmenších blokoch dát – po jednom znaku.Načítavanie po jednom znaku fgetc( ) / getc( )
Načítavanie po jednom znaku by sa mohlo zdať ako zbytočne alebo nevyužiteľné, ale má nesmierne veľa použití a jeho pravá sila je vo flexibilite. Uvediem pár príkladov pre toto využitie. Napríklad kódovanie metódou posúvania každého znaku o iný počet čísel v ASCI tabuľke, presné načítavanie vrátane medzier a pod.Všeobecný zápis – fgetc(pointer typu FILE)
Demonštrácia bude veľmi jednoduchá. Budeme načítavať zo súboru zdroj.txt ,v ktorom máme zapísaný reťazec „ahoj”. Budeme ho načítavať po jednom znaku a vypisovať do komponentu Memo.
Príklad
char c;
FILE *f;
f = fopen("C:\zdroj.txt","r"); //otvorenie súboru
c = fgetc(f); //priradenie načítanej hodnoty
while (c != EOF){ //podmienka,pokiaľ c nemá hodnotu EOF
Memo1->Lines->Add(c); //výpis do komponentu Memo
c = fgetc(f);
}
fclose(f); //korektné uzatvorenie
Načítavanie po reťazci fscanf( )
Táto funkcia načítava formátované reťazce nezáleží na dĺžke, indikujúci faktor kde jeden reťazec končí a iný začína je medzera. Táto funkcia tiež konvertuje načítané reťazce do konkrétnych dátových typov.fscanf(f,”%q”, &nazov_premennej);
f - pointer typu FILE
q – predstavuje dátový typ, ktorý načítavame. Celé číslo ma tento koeficient d, desatinné má f, reťazec má s, znak má c.
Príklad
FILE *f;
char ret[20];
f = fopen("C:\zdroj.txt","r");
fscanf(f,"%s",&ret); //načítanie reťazca so súboru
Memo1->Lines->Add(ret);
Nabudúce budeme pokračovať v sdtio.h, konkrétne dokončíme načítavanie, výpis a používanie bufferu.