Fayla girişin ümumi alqoritmi

Proqram fayla oxumaq, yazmaq və s. məqsədlə müraciət et­­dik­də bunu aşağıdakı alqoritm üzrə yerinə yetirir.

Əvvəlcə faylı açmaq lazımdır. Beləliklə, proqramda fayl­ və axın obyekti arasında aşağıdakı əlaqə marşrutu yara­nacaq: fstream / ofstream və ya ifstream (faylın açılması ücün isti­fa­də olunur).

Sonra proqram fayldan oxuyur və ya fayla yazır (və ya ha­mı­sı birlikdə).

Nəhayət, proqram faylı bağlayır. Proqramda fayl və axın ob­yek­ti arasında əlaqə marşrutunun saxlanması sistem resurs­la­rı­nı tələb edir, faylın bağlanması isə əgər bu resurslar lazım deyilsə, onları azad edir. Buna görə də əgər əvvəlki müraciət zamanı fayl bağlanmayıbsa, onda ona yenidən müraciət etmək olmaz.

 

 

9.4. Faylın açılması

9.4.1. Yazmaq üçün faylın açılması

Yazmaq üçün fayl açarkən ya ofstream, ya da fstream obyek­tindən istifadə etmək lazımdır. ifstream obyektini bu məqsəd üçün istifadə etmək olmaz, ona görə ki, o, yalnız fayldan oxumaq üçün istifadə olunur.

ofstreamfstream obyektləri faylı aşağıdakı iki üsul­­dan biri ilə aça bilərlər. Birincisi ad altında funksiya – həddin isti­fa­də­sin­dən ibarətdir (open). Ikincisi isə konstruktorun tət­bi­qindən ibarətdir.

ofstreamfstream obyektlərində open funksiya – həddi is­­ti­­fa­də olunur, onun birinci parametri – açılan faylın adı və ona olan yoldur. Ikinci parametr ofstream və ya fstream ob­yekt­­lə­rin­dən hansının open funksiya–həddini çağırmasından və sus­ma­ya görə rejimdən fərqli olan rejimdə fayla müraciət etmə istə­yindən asılıdır.

Yazmaq üçün açılan faylın artıq mövcud olması vacib deyil. Əgər o, mövcud deyilsə, onda onu yazmaq üçün aç­ma­­ğa cəhd edəndə baxılan yolda göstərilən adla o, avtoma­tik ola­raq açılacaq. Lakin faylın mövcud olub – olma­ma­sın­dan ası­lı ola­raq açılan faylın adı və yolu hökmən göstə­ril­mə­li­dir. Bu mə­lu­ma­tı isə faylın ya nisbi yolu, ya da mütləq yo­lu şək­lin­də ver­mək olar.

Nisbi yol – bu bizim proqramın yerləşməsinə nəzərən olan yol­dur. Məsələn, aşağıdakı tələbə.dat faylı üçün açılan ifa­də proq­ramla eyni kataloqda yerləşir:

ofstream outfile

outfile . open(“telebe. dat”);

Mütləq yol – diskin hərfi ilə başlayan yoldur və faylın özünə qə­dər hər bir kataloq və altkataloqu özündə saxlayır. Məsələn, əgər telebe.dat faylı C diskində yerləşən College kataloqunun Qrup altkataloqunda yerləşirsə, onda o yazmaq üçün mütləq yolun köməyilə aşağıdakı kimi açılacaq:

ofstream outfile;

outfile.open (“c:\\ college \\ qrup \\ telebe.dat”);

Hansı yoldan istifadə olunursa olunsun, open funk­si­ya­sının pa­ra­metrinin sətir literal olması vacib deyil. O, sətir dəyişən də ola bilər. Məsələn,

ofstream outfile;

char filename[80];

cout << “enter name of file:”;

cin >> filename;

outfile . open (filename);

Qeyd.Əgər proqram müxtəlif kompüterlərdə istifadə olunursa, onda nisbi yol seçmək daha əlverişlidir.

Open funksiyasının istifadəsində faylın hansı rejimdə açıl­ma­sı da mühüm rol oynayır. Ilk növbədə faylın nə üçün açıl­ma­sı seçilir – oxumaq, yazmaq və s. Lakin seçimin başqa im­kan­ları da mövcuddur, onlardan hər biri faylın açılması rejiminin “flaqı”adlanır (cədvəl 9.1).

Cədvəl 9.1.

Faylın rejimi Təsviri
ios::app Birləşmə rejimi. Faylın məz­munu sax­­lanılır və bütün çı­xış faylın so­nu­na yazılır.
ios:: ate Əgər fayl artıq mövcud­dur­sa,­ proq­­ram onun­­­ sonuna­­ ötü­­rü­­lür. Çıxış fay­lın istə­ni­lən yerində yazıla bilər. Bu flaq əsasən ikilik rejimdə istifadə olunur.
ios:: binary Ikilik rejim. Məlumat fayla mətn şək­lində deyil, ikilik formatda yazı­lır.
ios:: in Daxiletmə rejimi. Məlumat fayl­dan oxu­nur. Əgər fayl mövcud deyil­sə, o, yara­dı­l­ma­­yacaq.
ios:: out Çıxış rejimi. Informasiya fayla ya­zı­lır. Susmaya görə, faylın məzmunu ye­­nidən yazılır.
ios:: trunc Əgər fayl artıq mövcud­dur­sa, onun məz­­munu silinəcək və ya yeni­dən yazı­lacaq. Bu rejim susmaya gö­rə ios:: out rejimində seçilmişdir.

 

Əgər faylın açılması üçün ofstream obyekti istifadə olu­nursa, onda heç bir faylın açılma rejiminin flaqına ehtiyac yox­dur. Çünki ofstream obyekti yalnız yazmaq üçün faylın açılmasına xidmət edir və faylın oxumaq üçün açılmasında tət­biq oluna bilməz.

Buna baxmayaraq, əgər susmaya görə faylın ikilik rejimdə de­yil, mətn rejimində açılması və verilənlərin mövcud fayla əlavə edilməyib yenidən yazılması bizi qane etmirsə, onda ofstream obyektinin open funksiyası ilə birlikdə faylın bir və ya bir neçə rejim flaqını istifadə etmək olar.

Beləliklə, faylı açarkən iki və daha çox flaqı uzlaşdırmaq olar. Məsələn, aşağıdakı operatorlar faylı ikilik rejimdə açır, sonra isə onları yenidən yazmaq əvəzinə verilənləri bir­ləş­di­rir­lər (bit­lər üzrə “və ya “(|) operatoru);

ofstream outfile;

outfile . open (“telebe . dat”, ios::binary | ios::app);

Əgər faylın açılması üçün ofstream obyekti istifadə olunursa, onda fayl rejimi flaqlarını təsvir etmək lazım deyil, əgər faylın açılması üçün fstream obyekti tətbiq olunursa, onda hökmən bunu etmək lazımdır. Bu halda ofstream obyekti oxumaq üçün yox, yalnız yazmaq üçün istifadə oluna bilər, fstream obyekti isə hər iki məqsədin qazanılmasına xidmət edir. Ona görə də əvvəlcədən dəqiq müəyyənləşdirmək lazımdır ki, open funk­si­ya­sı hansı məqsədlə tətbiq edilir: yazmaq üçün, oxumaq üçün və ya birdən hamısı üçün.

Aşağıdakı proqram fraqmentində fstream obyektinin open funksiyası faylı yalnız yazmaq üçün açır:

fstream afile;

afile . open (“telebe . dat”, ios::out);

Yazmaq üçün faylı açarkən fstream və ya ofstream konstruktorlarını da istifadə etmək olar. Konstruktor – obyektin nüs­xəsini yaratmaq istəyərkən avtomatik çağrılan funksiyadır.

Obyektin nümunəsi verilənlərin int sadə tipli dəyişə­ni­nə ox­şa­yır. Məsələn, aşağıdakı operator age adlı tam ədəd nü­mu­nə­si­nin yaradılması ola bilər:

int age;

Aşağıdakı operator isə afile adlı fstream nümunəsi yara­dır:

fstream afile;

Obyektin konstruktorları həddən artıq yüklənə bilərlər, yəni bir obyekt üçün parametrsiz konstruktor , bir parametrli, iki parametrli konstruktor və s. yaradıla bilər. Məsələn, yu­xa­rı­dakı operatorda fstream afile fstream obyektinin para­metr­siz konstruktorudur.

Aşağıdakı operator ofstream obyektinin bir parametrli kons­tru­ktorunu çağırır:

ofstream outfile(“telebe . dat”, ios::out);

Növbəti operator fstream nümunəsi yaratmaqla və telebe. da­­t faylını çıxış üçün açmaqla, fstream obyektinin iki parametrli konstruktorunu çağırır.

fstream afile(“telebe . dat”, ios::out);

Öz-özlüyündə bir operatorda ofstream (və ya fstream) də­yi­şə­ni­nin elan olunması, sonra isə ikinci operatorda open funksiya –­həddinin çağırılması sadə dəyişənin bir operatorda elan olunması və ona ikinci operatorda qiymət mənimsədilməsi ilə analojidir. Məsələn,

int age;

age=54;

Bir və ya iki parametrli ofstream (və ya fstream) kon­struk­torunun istifadə olunması sadə dəyişənin adlan­dı­rıl­masına ekvivalentdir:

int age=54;

Misal 9.1.Faylın yaradılmasına aid proqram.

ProqramDev-C++da işlənilmişdir. Bunun üçün File men­yu­sun­dan New->Project… altmenyusunu seçib, açılan pən­cə­rə­də şəkil­dəki kimi Console ApplicationC++Projectqeyd edib OK düyməsini sıxmaq lazımdır.

 

Qeyd: Əgər proqram standart C–də yazılmışdırsa, onda C Poject –i aktivləşdirmək lazımdır.

Bundan sonra, layihəyə ad verilməsi tələb olunur:

 

 

Yeni ad verib Сохранитьdüyməsini sıxmaq lazımdır. Indi isə proqramın mətnini yığmaq lazımdır:

 

 

#include <stdlib.h>

#include <iostream.h>

#include <fstream.h>

using namespace std;

int main()

{ ofstream outtelebefile("telebe.dat",ios::out);

if(!outtelebefile){

cerr<<"fayli acmaq mumkun deyil"<<endl;

exit(1);

}

cout<<"kodu, adi ve toplanan bali daxil et"­<<­endl­<<­">>";

int account;

char name[10];

float bal;

while(cin>>account>>name>>bal){

outtelebefile<<account<<' '

<<name<<' '<<bal<<endl;

cout<<">>";

}

getch();

return 0;

}

Proqramdaofstream outtelebefile("telebe.dat",ios::out) elanı çıxış üçün açılan telebe.dat faylı ilə əlaqəli və ofstream sinfindən outtelebefile obyektini yaradır. Proqramın mətnini yığıb qurtardıqdan sonra Executemenyusundan Compile & Run altmenyusunu sıxmaqla açılmış pəncərədə verilənləri daxil etmək lazımdır. Faylın sonu üçün isə Ctrl + Z düymələrini birgə sıxmaq lazımdır. Alınmışnəticə aşağıdakı kimi olacaq:

 

9.4.2. Oxumaq üçün faylın açılması

Əvvəlki bənddə yazmaq üçün faylın açılması haqqında bütün deyilənlər oxumaq üçün faylın açılması üçün də doğrudur. Əsas fərq ondan ibarətdir ki, open funksiyasını və ya onun konstruktorunu çağıran obyekt fstream obyektindən asılı olmayaraq istifadə olunur. Buna görə də açılan fayl artıq mövcud olmalıdır. Faylın yazmaq üçün açılmasından fərqli olaraq, oxumaq üçün faylı açmaq cəhdi, fayl olmadıqda onu yaratmayacaq.

Aşağıdakı operatorlarda oxumaq üçün faylın açılmasında ifstream obyektinin open funksiya –həddi istifadə olunub:

ifstream infile;

infile. open(“telebe . dat”);

Bu məqsədə fstream obyekti ilə də çatmaq olar:

fstream afile;

afile . open(“telebe.dat”,ios::in);

Aşağıdakı operatorda oxumaq üçün faylın açılmasında ifstream konstruktoru istifadə olunur:

ifstream infile (“telebe . dat”)

bunu aşağıdakı kimi də etmək olar:

fstream afile(“telebe . dat”, ios::in);

9.4.3. Faylın oxumaq və yazmaq üçün açılması

Bu məqsədlə fstream obyektindən istifadə etmək olar, if­stre­am və ya ofstream obyektlərindən isə istifadə etmək ol­maz, çünki, ofstream obyekti faylın oxunması, ifstream ob­yek­ti isə fayla yazmaq üçün tətbiq oluna bilməz.

Aşağıdakı kod fraqmentində bu məqsədlə fstream ob­yekti­nin open funksiya – həddi istifadə olunmuşdur:

fstream afile;

afile . open (“telebe . dat”, ios::in)|ios::out);

hər iki halda bit üzrə operator və ya (|) istifadə olunmuşdur.

Qeyd edək ki, ios::in və ios::out flaqlarının birgə istifadəsi sus­maya görə qiyməti dəyişir. ios::out flaqı öz – özlüyündə möv­cud faylı yenidən yazır, ios::in flaqı isə gözləyir kı, fayl artıq möv­cuddur. Lakin bu flaqlar birgə istifadə olunduqda faylın məz­munu saxlanılır və əgər fayl mövcud deyilsə, onda o, yara­dı­lır.

Lakin open funksiya – həddi və ya konstruktorun olması hə­lə fay­lın müvəffəqiyyətlə açılması demək deyildir. Bunun bir ne­çə səbəbi var. Faylın oxumaq və yazmaq üçün açılması ara­­sın­da əsas fərq ondan ibarətdir ki, hələlik mövcud olmayan fay­lı yaz­maq istəyirik - əməliyyat sistemi avtomatik olaraq fayl ya­ra­dacaq, lakin mövcud olmayan fayldan oxumaq müm­kün ol­ma­yacaq. Ona görə də fayldan oxumazdan əvvəl onun açıl­­ma­sı­na tam əmin olmaq lazımdır.

Əgər fayl oxumaq üçün açıla bilmirsə, onda open funk­si­ya­sını ça­ğıran ifstream obyektinin qiyməti NULL (qiyməti sıf­ra bə­ra­bər olan sabitdir) olur. Digər üsul isə ondan ibarətdir ki, əgər fayl oxumaq üçün açıla bilmirsə, funksiya – həddi doğ­ru qiy­mət­ qaytarır. Bu isə o deməkdir ki, faylı açmaq müm­kün ol­ma­dı.

Aşağıdakı proqramda faylın açılmasının hər iki üsulunun isti­fa­də­si şərh olunur:

 

#include <fstream>

#include <iostream>

using namespase std;

int main ( )

{

ifstream infile;

infile . open (“telebe . dat”);

cout << “(infile) =” <<infile <<endl;

cout << “(infile . fail()) =”<< infile . fail() <<endl;

return 0;

}

Əgər telebe . dat faylı mövcud deyilsə, çıxış belə olur:

(infile)=00000000

(infile . fail( ))=1

Lakin əgər telebe.dat faylı proqram olan kataloqda yer­lə­şirsə, onda çıxış belə olar:

(infile) = 0012FE40

(infile. fail( ))= 0

Qeyd edək ki, 0012FE40 qiyməti – infile dəyişəninin ifstream ünvanıdır və söz yox ki, proqramda başqa cür də ola bilər.

ifstream obyektindən fərqli olaraq, mövcud olmayan faylı aç­maq istəyən ofstream obyekti NULL-a bərabər deyil və onun fail funksiya həddi yalan qiymət qaytarır. Ona görə də əmə­liy­yat sistemi hələlik mövcud olmayan faylı açacaq. Buna bax­ma­ya­raq, yazmaq üçün faylın açılması həmişə uğurlu ol­mur. Mə­sə­lən, aşağıdakı proqramı buraxmazdan əvvəl, proqram yer­lə­şən kataloqda telebe.dat faylı yaratmaq və onun xassələri da­xi­lin­də “yalnız oxumaq üçün” qiymətini qurmaq lazımdır:

 

#include <fstream>

#include <iostream>

using namespase std;

int main ( )

{

ofstream outfile;

outfile . open (“telebe . dat”);

cout << “(outfile) =” <<outfile <<endl;

cout << “(outfile . fail()) =”<< outfile . fail() <<endl;

return 0;

}

9.5. Faylın bağlanması

Faylla işi qurtardıqdan sonra onu bağlamaq lazımdır. Proq­ram öz işini sona çatdırdıqdan sonra faylın obyekti avtomatik ola­raq, bağlanır. Hər bir açıq fayl sistemin resurslarını tələb et­diyindən faylla işləməni qurtardıqdan sonra onu bağladıqda proqramın məhsuldarlığı artır. Bundan başqa, bəzi əməliyyat sistemlərində açıq faylların miqdarı məhduddur.

Faylı bağlamaq parametrsiz close funksiya – həddi ilə hə­ya­ta keçirilir. Aşağıdakı proqramda yazmaq üçün açılmış fayl bağ­lanır:

ofstream outfile;

outfile . open(“telebe. dat”);

// nə isə edirik

outfile . close();

oxumaqüçün açılmış faylın bağlanması:

ifstream infile;

infile . open(“telebe . dat”);

// nə isə edirik

infile . close();