Fayla girişin ümumi alqoritmi
Proqram fayla oxumaq, yazmaq və s. məqsədlə müraciət etdikdə 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 yaranacaq: fstream / ofstream və ya ifstream (faylın açılması ücün istifadə olunur).
Sonra proqram fayldan oxuyur və ya fayla yazır (və ya hamısı birlikdə).
Nəhayət, proqram faylı bağlayır. Proqramda fayl və axın obyekti arasında əlaqə marşrutunun saxlanması sistem resursları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 obyektində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.
ofstream və fstream obyektləri faylı aşağıdakı iki üsuldan biri ilə aça bilərlər. Birincisi ad altında funksiya – həddin istifadəsindən ibarətdir (open). Ikincisi isə konstruktorun tətbiqindən ibarətdir.
ofstream və fstream obyektlərində open funksiya – həddi istifadə olunur, onun birinci parametri – açılan faylın adı və ona olan yoldur. Ikinci parametr ofstream və ya fstream obyektlərindən hansının open funksiya–həddini çağırmasından və susmaya 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, avtomatik olaraq açılacaq. Lakin faylın mövcud olub – olmamasından asılı olaraq açılan faylın adı və yolu hökmən göstərilməlidir. Bu məlumatı isə faylın ya nisbi yolu, ya da mütləq yolu şəklində vermək olar.
Nisbi yol – bu bizim proqramın yerləşməsinə nəzərən olan yoldur. Məsələn, aşağıdakı tələbə.dat faylı üçün açılan ifadə proqramla 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 funksiyasının parametrinin 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çılması da mühüm rol oynayır. Ilk növbədə faylın nə üçün açılması seçilir – oxumaq, yazmaq və s. Lakin seçimin başqa imkanları 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əzmunu saxlanılır və bütün çıxış faylın sonuna yazılır. |
ios:: ate | Əgər fayl artıq mövcuddursa, proqram onun sonuna ötürülür. Çıxış faylın istənilən yerində yazıla bilər. Bu flaq əsasən ikilik rejimdə istifadə olunur. |
ios:: binary | Ikilik rejim. Məlumat fayla mətn şəklində deyil, ikilik formatda yazılır. |
ios:: in | Daxiletmə rejimi. Məlumat fayldan oxunur. Əgər fayl mövcud deyilsə, o, yaradılmayacaq. |
ios:: out | Çıxış rejimi. Informasiya fayla yazılır. Susmaya görə, faylın məzmunu yenidən yazılır. |
ios:: trunc | Əgər fayl artıq mövcuddursa, onun məzmunu silinəcək və ya yenidən yazılacaq. Bu rejim susmaya görə ios:: out rejimində seçilmişdir. |
Əgər faylın açılması üçün ofstream obyekti istifadə olunursa, onda heç bir faylın açılma rejiminin flaqına ehtiyac yoxdur. Çünki ofstream obyekti yalnız yazmaq üçün faylın açılmasına xidmət edir və faylın oxumaq üçün açılmasında tətbiq oluna bilməz.
Buna baxmayaraq, əgər susmaya görə faylın ikilik rejimdə deyil, 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 birləşdirirlər (bitlə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 funksiyası 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üsxəsini yaratmaq istəyərkən avtomatik çağrılan funksiyadır.
Obyektin nümunəsi verilənlərin int sadə tipli dəyişəninə oxşayır. Məsələn, aşağıdakı operator age adlı tam ədəd nümunəsinin yaradılması ola bilər:
int age;
Aşağıdakı operator isə afile adlı fstream nümunəsi yaradı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, yuxarıdakı operatorda fstream afile – fstream obyektinin parametrsiz konstruktorudur.
Aşağıdakı operator ofstream obyektinin bir parametrli konstruktorunu çağırır:
ofstream outfile(“telebe . dat”, ios::out);
Növbəti operator fstream nümunəsi yaratmaqla və telebe. dat 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şəninin 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) konstruktorunun istifadə olunması sadə dəyişənin adlandırılması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 menyusundan New->Project… altmenyusunu seçib, açılan pəncərədə şəkildəki kimi Console Application və C++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, ifstream və ya ofstream obyektlərindən isə istifadə etmək olmaz, çünki, ofstream obyekti faylın oxunması, ifstream obyekti isə fayla yazmaq üçün tətbiq oluna bilməz.
Aşağıdakı kod fraqmentində bu məqsədlə fstream obyektinin 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 susmaya görə qiyməti dəyişir. ios::out flaqı öz – özlüyündə mövcud faylı yenidən yazır, ios::in flaqı isə gözləyir kı, fayl artıq mövcuddur. Lakin bu flaqlar birgə istifadə olunduqda faylın məzmunu saxlanılır və əgər fayl mövcud deyilsə, onda o, yaradılır.
Lakin open funksiya – həddi və ya konstruktorun olması hələ faylı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ı arasında əsas fərq ondan ibarətdir ki, hələlik mövcud olmayan faylı yazmaq istəyirik - əməliyyat sistemi avtomatik olaraq fayl yaradacaq, lakin mövcud olmayan fayldan oxumaq mümkün olmayacaq. Ona görə də fayldan oxumazdan əvvəl onun açılmasına tam əmin olmaq lazımdır.
Əgər fayl oxumaq üçün açıla bilmirsə, onda open funksiyasını çağıran ifstream obyektinin qiyməti NULL (qiyməti sıfra bərabə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 qiymət qaytarır. Bu isə o deməkdir ki, faylı açmaq mümkün olmadı.
Aşağıdakı proqramda faylın açılmasının hər iki üsulunun istifadə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 yerləş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əliyyat sistemi hələlik mövcud olmayan faylı açacaq. Buna baxmayaraq, yazmaq üçün faylın açılması həmişə uğurlu olmur. Məsələn, aşağıdakı proqramı buraxmazdan əvvəl, proqram yerləşən kataloqda telebe.dat faylı yaratmaq və onun xassələri daxilində “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. Proqram öz işini sona çatdırdıqdan sonra faylın obyekti avtomatik olaraq, bağlanır. Hər bir açıq fayl sistemin resurslarını tələb etdiyində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əyata 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();