DARBAS SU FAILAIS C++ KALBOJE

DARBAS SU FAILAIS C++ KALBOJE

Programos struktūra

Atkreiptinas dėmesys į tokias C++ kalbos ypatybes:• yra tik vienas programų struktūrizavimo būdas. Tai skaidymas į funkcijas (visi programų blokai vadinami vienodai – funkcijomis);• pagrindinę programos dalį atitinka pagrindinė funkcija, kuri žymima vardu main;• identifikatoriuose (varduose) didžiosios ir mažosios raidės traktuojamos skirtingai; • programos elementų (kintamųjų, struktūrų, funkcijų) aprašai gali būti bet kurioje programos vietoje. Svarbu, kad elementas prieš jį naudojant jau būtų apibrėžtas;• programos elementų aprašuose plačiai vartojami funkcijų prototipai (prototipas – tai tik funkcijos antraštė); • C++ kalboje yra nedidelis standartizuotų operatorių skaičius, tačiau yra daug įvairių funkcijų bibliotekų; • kreipiantis į kintamuosius ir struktūras, plačiai vartojamos rodyklės (rodyklė – tai kintamasis, kuris įsimena adresą);• daugelio tipų duomenis galima interpretuoti įvairiai (pvz., į baite užrašytą informaciją galima žiūrėti kaip į simbolį arba kaip į sveikąjį skaičių).Tipinė C++ programos (programos failo) struktūra yra tokia: /* Pirminio apdorojimo instrukcijos */ /* Globaliųjų elementų aprašai */ /* Funkcijų prototipai (vartotojo sukurtų funkcijų antraštės) */ main() { /* Pagrindinės funkcijos tekstas – sakinių visuma */ } /* Vartotojo sukurtų funkcijų tekstai */Čia programos struktūros apraše yra panaudotos tokios C++ kalbos sintaksinės konstrukcijos:• komentarai – tai paaiškinamasis tekstas, kurio ribos žymimos simbolių poromis /* ir */. Leistinas ir kitas komentarų pavidalas. Parašius eilutėje du pasvirusius brūkšnius //, toliau esantis tekstas iki eilutės pabaigos taip pat laikomas komentaru;• main() – tai pagrindinės funkcijos antraštė;• sudėtinis sakinys – tai tarp riestinių skliaustų {} įrašyti sakiniai, kurie traktuojami kaip sudėtingas vienetas.Programos struktūros apraše parodyta programos elementų rašymo tvarka:• programos pradžioje rašomos pirminio apdorojimo instrukcijos (preprocessor), kuriomis nurodoma, kokius programos teksto pertvarkymus reikia atlikti prieš kompiliuojant ją; • apibrėžiami globalieji programos elementai, kurie galės būti vartojami visame rengiamos programos faile (tiek pagrindinėje, tiek kitose vartotojo sukurtose funkcijose);

• vartotojo sukurtų funkcijų tekstai gali būti rašomi ne tik programos gale, bet ir tuoj po globaliųjų elementų aprašų dalies. Rašant šias funkcijas programos gale, yra lengviau skaityti ir analizuoti visos programos tekstą. Pastaruoju atveju atsirandančio prieštaravimo, kad funkcijas reikia pirma aprašyti, o tik po to vartoti, išvengiama po globaliųjų elementų aprašų dalies pateikiant funkcijų prototipus. Funkcijos prototipas – tai pirmasis funkcijos sakinys (antraštė). Programai tikslinga suteikti vardą ir rašyti jį pirmoje eilutėje kaip komentarą. Čia rekomenduojama rašyti platesnius paaiškinimus apie programą. Vėliau tai padeda programuotojui lengviau ir greičiau prisiminti ar sužinoti programos paskirtį ir kitus duomenis apie ją.

Duomenų failai

Apdorojant didesnius duomenų kiekius, patogu juos laikyti failuose (pvz., diskuose). Failo tipo rodyklės aprašomos taip: FILE *F;Failai paruošiami darbui funkcija (ji laikoma bibliotekoje stdio.h), kurios prototipas yra:FILE *fopen (const char *Failo_Vardas, const char *M);Failo_Vardas nurodomas simbolių eilute, vardine konstanta arba kintamuoju. Antruoju parametru M (simbolių eilute, vardine konstanta arba kintamuoju) nurodomas failo stovis, t.y. leistina failo informacijos perdavimo kryptis. Galimi failų stovio požymiai: r- failą galima tik skaityti; w- Failas skirtas tik rašymui. Jei toks failas jau buvo, tai jis ištrinamas ir kuriamas naujas. a- Papildyti failą duomenimis, rašant juos failo gale. Jei nurodyto failo dar nebuvo, jis sukuriamas. Stovio požymį papildžius raide t (rt, wt, at), failas bus paruoštas darbui kaip tekstinis. Stovio reikšmę papildžius raide b (rb, wb, ab), failas bus paruoštas darbui kaip binarinis. Jeigu nėra nei t, nei b raidės, tai failo parengimas darbui priklauso nuo globaliojo kintamojo fmode reikšmės. Kiekviena stovio nuoroda gali būti papildyta ženklu + , pavyzdžiui, r+, w+, wt+. Tai reiškia, kad failai gali būti atnaujinami, t.y. leidžiama juos skaityti ir rašyti.

Pagrindinių buferizuotų įvedimo/išvedimo funkcijų prototipai (antraštės) yra laikomos stdio.h bibliotekoje. Įvedimo/įšvedimo funkcijos:Funkcijos prototipas (antraštė) Funkcijos atliekami veiksmai int printf (const char *f [,]);

int scanf (const char *f [,);

int fclose (FILE *rod); int putc (int simbolis, FILE *rod); int getc (FILE *rod); int putw (int sk, FILE *rod); int getw (FILE *rod); char *fgets (char *s, int n, FILE *rod); int fputs (const char *s, FILE *rod); int fread (void *buf, int t, int n, FILE *rod);

int fwrite (void *buf, int t, int n, FILE *rod);

int fprintf (FILE *rod, const char *f [,]);

int fscanf (FILE *rod, const char *f [,]);

int feof (FILE *rod);

int ferror (FILE *rod);

int remove (const char *vardas); Išveda į ekraną kintamųjų reikšmes pagal šabloną f ;Įveda klaviatūra reikšmes į kintamųjų atminties laukus pagal šabloną f ;Uždaro failąRašo simbolį į failąSkaito simbolį iš failo Rašo skaičių į failą Skaito skaičių iš failo Skaito n simbolių ilgio eilutę s Rašo eilutę s į failąSkaito n blokų, turinčių po t baitų, iš failo rod į buferį buf; funkcijos fread reikšmė – perskaitytų blokų skaičiusRašo n blokų, turinčių po t baitų, iš buferio buf į failą rod; funkcijos fwrite reikšmė – užrašytų blokų skaičiusRašo į failą rod reikšmes sąrašo elementų pagal šabloną f ; šablonas f ir kintamųjų sąrašas sudaromi taip pat, kaip ir funkcijoje printfSkaito sąrašo elementų reikšmes iš failo pagal šabloną f ; šablonas f ir elementų sąrašas sudaromi taip pat, kaip ir funkcijoje scanf. Funkcijos fscanf reikšmė – perskaitytų elementų skaičiusTikrina skaitomo failo pabaigą. Jei dar ne failo pabaiga, funkcijos reikšmė nelygi nuliuiTikrina darbo su failu klaidas. Jei klaidų nebuvo, funkcijos reikšmė lygi nuliui

Šalina failą

Programai apdorojamų failų vardai gali būti perduodami per pagrindinės funkcijos main parametrus. Tokios pagrindinės funkcijos prototipas yra: int main ( int n, char *argv[ ] ); Čia n – argumentų skaičius, o argv – argumentams skirto eilučių masyvo rodyklė. Argumentų reikšmės yra nurodomos programos iškvietimo komandoje ir yra atskiriamos tarpais. Nulinę indekso reikšmę turinčioje argumentų masyvo eilutėje užrašomas pačios programos pavadinimas.

Duomenų įvedimas/išvedimas

Duomenims įvesti/išvesti yra naudojamos standartinės funkcijos, laikomos šiose bibliotekose: stdio.h iostream.h io.h conio.h Bibliotekos stdio.h funkcijos: Aprašant I/O (įvedimo/išvedimo) operacijas, vartojama “srauto” sąvoka. Srautas – tai abstrakcija, leidžianti atsiriboti nuo konkretaus I/O įrenginio (disko, terminalo, kt.). Srautai būna dviejų tipų: • Tekstinis srautas (simbolių srautas). Tai specialiais simboliais (CR – carriage return, LF – line feed) į eilutes suskaidyta simbolių seka. Ne visa simbolių srauto informacija yra matoma konkrečiame atvaizdavimo įrenginyje (spausdintuve, ekrane), nes dalis simbolių (CR, LF) yra skirti srauto perdavimui valdyti;• Dvejetainis srautas. Tai bitų seka, tiksliai atitinkanti informaciją konkrečiame įrenginyje. Kiekviena programa automatiškai atidaro 5 standartinius tekstinius srautus:stdin (įvedimo srautą), stdaux (papildomą),stdout (išvedimo), stdprn (spausdintuvo).stderr (pranešimų apie klaidas),Jie susiejami su standartiniais sisteminiais I/O įrenginiais. Dažniausiai srautai stdin, stdout, stderr yra susiejami su konsole – klaviatūra ir ekranu. Standartinį I/O įrenginį (konsolę) operacinės sistemos priemonėmis galima pakeisti kitu. Standartiniams srautams (išvedamiems į ekraną ir įvedamiems klaviatūra) valdyti vartojamos funkcijos printf ir scanf . Jų prototipai (antraštės) yra:int printf (const char *šablonas [,]);int scanf (const char *šablonas, );Pastebėkime, kad duomenų išvedimo funkcijoje printf po “šablono” nurodomi kintamųjų vardai, o įvedimo funkcijoje scanf – kintamųjų adresai. Pavyzdžiui, jei turime kintamąjį vardu a , tai jo adresas žymimas &a .

“Šablonas” – tai simbolių eilutė (ji rašoma tarp dvigubų kabučių) su joje įterptais duomenų formatais ir valdančiaisiais simboliais. Duomenų formatais nurodoma įvedamiems/išvedamiems duomenims skiriamų laukų struktūra arba jų interpretavimo būdas. Tipinė formato struktūra yra tokia:%[][] [.]Dažniausiai naudojami požymiai yra tokie:– – lygiuoti išvedamus duomenis pagal kairįjį lauko kraštą;+ – nurodyti išvedamo skaičiaus ženklą (+ ar –);Duomenų tipai žymimi raidėmis : d arba i- sveikasis skaičius; o- aštuntainis sveikasis skaičius; u- sveikasis skaičius be ženklo; x- šešioliktainis sveikasis skaičius; c-simbolis; f- slankaus kablelio skaicius; s- simbolių eilutė; e- rodyklinės formos skaičius; p- rodyklė (adresas).Išvedimo funkcijoje printf valdantieji simboliai gali būti įterpiami bet kurioje šablono vietoje. Valdančiojo simbolio užrašymo sintaksė: simbolis: Skambutis a; Eilutės pabaigar; Pereiti į kitos eilutės tą pačią poziciją f; Pereiti į kitos eilutės pradžią n; Horizontali tabuliacija t; Vertikali tabuliacija v; Nulinis simbolis ; Jeigu norime “Šablone” turėti simbolį ” arba , jie turi būti rašomi atitinkamai ” arba \. To priežastis yra ta, kad simboliu ” nurodoma eilutės pradžia ir pabaiga, o simboliu – valdantysis simbolis.Duomenims įvesti/išvesti dažnai yra naudojami bibliotekoje iostream.h laikomi objektai cin , cout ir duomenų srauto nukreipimo operatoriai << ir >> . Duomenims išvesti į ekraną yra vartojamas sakinys : cout << elementas ;Šitokiu sakiniu išvedama į ekraną. Elementas – tai kintamasis arba tarp dvigubų kabučių (“) užrašytas kompiuterio abėcėlės simbolių ir valdančiųjų simbolių rinkinys. Valdančiuoju simboliu n ekrano žymeklis perkeliamas į naujos eilutės pradžią. Cout sakiniu norint žymeklį perkelti į naujos eilutės pradžią, rekomenduojama jame naudoti operatorių endl. Išvedamų rezultatų formatui nustatyti šiuo atveju naudojami bibliotekoje iomanip.h saugomi manipuliatoriai. Manipuliatoriai gali būti įterpiami į išvedamų simbolių srautus. Tai: setw (m), m – lauko plotis simboliais; setprecision (n) , n – skaitmenų skaičius.
Jei setw nurodyto lauko dydžio skaičiui išvesti nepakanka, manipuliatorius ignoruojamas. Manipuliatorius setw galioja artimiausiai išvedamai reikšmei, o setprecission – iki naujo nurodymo. Standartinis duomenų įvedimas klaviatūra nurodomas sakiniu: cin >> Kintamasis;Kaip turi būti interpretuojami (apdorojami) įvesti simboliai, sprendžiama pagal kintamojo, kuriam vedama reikšmė, tipą.Keletui kintamųjų reikšmes įvesti galima taip: cin >> a >> b >> c;

Pavyzdys: Tarkime faile c:katalogduom6.dat yra surašyti skaičiai. Reikia skaityti duomenis iš šio failo, surašyti juos į programoje aprašytą masyvą ir išvesti į ekraną. Toliau – apskaičiuoti masyvo elementų sumą ir išvesti į ekraną.#include #include const int Kiek = 15;typedef int mas [Kiek];FILE *F;void Sp (mas, int); // Masyvo spausdinimo funkcijos prototipasint Suma (mas, int); // Masyvo elementu sumavimo funkcijos prototipasint main() // Pagrindine programa{mas A; int n = 0; F = fopen(“c:\katalog\duom6.dat”, “r”); if (F == NULL) printf(“Failas neatidarytas”); else { while (!feof(F) && ( n < Kiek)) { fscanf ( F, “%d”, &A[n] ); // skaito is failo F if ( !feof(F) ) n++; } Sp(A, n); printf (“n n Suma = %d n “, Suma(A, n)); } printf (“nnProgramai uzbaigti paspauskite bet kuri klavisan”); system (“PAUSE”); return 0;}void Sp(mas X, int n) // Masyvo išvedimo į ekraną funkcija{int i = 0; while (i