Misal 2. Aşağıdaki proqramda seekg( ) funksiyası faylın göstəricini faylın daxilində göstərilən mövqeyə qoyur və bu mövqedən başlayaraq faylın məzmununu çıxışa verir. Faylın adı və oxumağa başlanan mövqeyin nömrəsi əmr sətrində verilir. //seekg( )-funksiyasının işinin nümayişi
#include #include #include using namespace std; int main(int argc, char*argv[ ]) { char ch; if(argc!=3){ cout<<”axtarış:\n”; return 1; } ifstream in(argv[1], ios::in\ios::binary); if(!in){ cout<<”faylı açmaq mümkün deyildir\n”; return 1; } In.seekg(atoi(argv[2]), ios::beg); while(!in.eof( )) { in.get(ch); cout< } In.close( ); return 0; } Main-funksiyasında formal parametrlər main(int argc, char*argv[ ]) argc-proqramda arqumentlərin sayını göstərir. Məsələ,
cout<<”Axtarıs:” Burada arqumentlərin sayı 3-dür(). Arqumentlər əmr sətrində göstərilir.
argv-göstəricilər massividir və bu massivdə proqramın arqumentləri yerləşir(Məsələ, ).
6.61.Formatlaşmayan ikilik giriş və çıxış əməliyyatları İnformasiyanın ASCII-kodunda təsvir olunan mətn faylları şəklində verilməsi bir çox hallarda əhəmiyyətlidir. Lakin bu faylların giriş-çıxış əməliyyatları ikilik faylların giriş-çıxış əməliyyatlarına nəzərən böyük imkanlara malik deyildir.
Ikilik fayllarla işləmək üçün çoxlu sayda giriş və çıxış funksiyaları vardır. Bu funksiyaların fayldan oxumaq və fayla yazmaq proseslərinə nəzarət etmək imkanı vardır. Belə fayllar ikilik rejimdə açılmalıdır(ios::binary). Bütün fayllar susma prinsipinə görə mətn rejimində açılır. Mətn rejimində bəzi simvollar üzərində çevirmə əməliyyatlar yerinə yetirilir. Məsələ, “kartateykanın qaytarılması/sətrin köçürülməsi” simvollar ardıcıllığı simvolu yeni sətrə köçürür.
Əgər fayl ikilik rejimdə açılırsa belə çevirmə baş vermir. Qeyd edək ki, istənilən faylı-həm formatlaşan mətndən ibarət olan faylı, həm də formatlaşmayan verilənlərdən ibarət olan faylı-həm mətn, həm də ikilik rejimdə açmaq olar. Onlar arasındaki fərq yuxarıda göstərilən simvol çevirməsinin olması və ya olmamasıdır.
İkilik giriş-çıxışın aşağı səviyyəsində get( ) və put( ) funksiyaları yerləşir. put( ) funksiyasının köməyi ilə bir bayt yazmaq və get( ) funksiyasının löməyi ilə bir bayt oxumaq olar. Bu funksiyalar uyğun olaraq giriş və çıxışın bütün siniflərinin üzvləridir. get( ) və put( ) funksiyalarının çoxlu formaları vardır. Onlardan ən çox istifadə olanı aşağıdakilardır:
istream & get(char&simvol); ostream & put(char simvol); get( ) funksiyası onunla əlaqəli olan axından bir simvol oxuyur və onu simvol arqumentinə verir. Onun qaytardığı qiymət axına olan istinaddır. Faylın sonu simvolunu oxuyan zaman axını false qaytarır.
put( ) funksiyası simvolu axına yazır və axına olan istinadı qaytarır.
İkilik verilənlərin bloklarda oxunması və yazılması üçün read( ) və write( ) funksiyalarından istifadə edilir. Bu funksiyalar da giriş-çıxış üçün olan axın siniflərin üzvü olan funksiyalardır. Onların prototipləri aşağıdaki kimidir:
istream & read(char*bufer,streamsize baytların sayı); ostream & write(const char*bufer,streamsize baytların sayı); read( ) funksiyası axından baytların sayı arqumentində göstərilən sayda baytları oxuyur və onları bufer göstəricisi ilə müəyyən olunan buferə göndərir. write( ) funksiyası bufer göstəricisi ilə müəyyən olunan buferdə baytların sayı arqumentində göstərilən sayda baytı uyğun axına yazır. Streamsize tipi tam ədədin müyyən bir formasıdır. Əgər faylın sonu əlamətinə buferdəki simvolların hamsı oxunmamış rast gəlinərsə, onda read( ) funksiyasının yerinə yetirilməsi yekunlaşır və buferdə müəyyən sayda simvollar qalır. Buferdən neçə simvol oxunduğunu bilmək üçün gcount( ) adlı funksiyadan istifadə etmək olar. Bu funksiyanın prototipi aşağıdaki kimidir:
streamsize gcount( );
Misal 1.Aşağıdaki proqram faylın məzmununu ekrana verir. get( )- funksiyasından istifadə edilir.
#include #include using namespace std; int main( ){ char ch; ifstream in(“infor”, ios::in\ios::binaty); if(!in){ cout<<”faylı açmaq mümkün deyildir\n”; return 1; } while(!in.cof( )){ in.get(ch); cout< } in.close( ); return 0; } Misal 2.Aşağıdaki proqramda istifadəçı tərəfindən daxil edilən simvollar put( ) funksiyası vasitəsi ilə fayla yazılır. Proqram ?-simvolu daxil edildikdə yekunlaşır.
#include #include using namespace std; int main( ){ char ch; ofstream out(“infor”,ios::out\ios::binary);
if(!out){ cout<<”faylı açmaq mümkün deyildir\n”; return 1; }
cout<<”dayanmaq üçün ?-simvolunu sıxın\n”; do{ cout<<”:”; cin.get(ch); out.put(ch); } while(ch!=’?’); out.close( ); return 0; } Burada cin axınından simvolları oxumaq üçün get( ) funksiyasından istifadə edilmişdir. Bu funksiya probelləri nəzərə alınmasına imkan verir.
Misal 3.Aşağıdaki proqramda double tipli ədədin və sətrin test faylına write( ) funksiyasının köməyi ilə yazılması nümayiş etdirilmişdir:
Əvvəlki misalda olduğu kimi read( ) funksiyasının daxilində tiplərin çevrilməsi əməliyyatı yerinə yetirilir. Çünki C++ dilində bir tipin göstəricisi avtomatik olaraq digər tipin göstəricisinə çevrilmir.
Misal 5.Aşağıdaki double tipli massiv fayla yazılır və sonra fayldan oxunan simvolların sayı ekranda əks olunur:
//gcout( ) funksiyasının işinin nümayiş etdirilməsi
#include #include using namespace std; int main( ) { ofstream out(“test”, ios::out/ios::binary); cout<<”faylı açmaq mümkün deyildir\n”; return 1; } double nums[4]={1.1, 1.2, 1.3, 1.4}; out.write((char*)nums, sizeof(nums)); out.close( ); ifstream in(“test”, ios::in\ios::binary); if(!in){ cout<<”faylı açmaq mümkün deyildir\n”; return 1; } in.read((char*)&nums, sizeof(nums)); int i; for(i=0; i<4; i++) cout< cout<<’\n’; cout< in.close( ); return 0; }