2.13. Oqimli kiritish va chiqarish.
Muhim so`zlar: fayl, oqimli kiritish, chiqarish, buffer, stdin, stdout, fopen, fputs, puts, fclose, perror.
Bilib olasiz: oqim bilan ishlash, fayllardan o`qish, oqim bilan bog`liq fopen() parametrlari, qo`llash, perror() funksiyasi, fayllar bilan ishlovchi oddiy operatorlarni.
C ++ tilining asosiy xususiyatlaridan biri oldindan rejalashtirilgan fayllar strukturasi yo`qligidir. Hamma fayllar, baytlar ketma-ketligi deb ko`riladi. UNIX operatsion sistemasida har bir qurilmaga «Maxsus fayl» mos keladi, shuning uchun C++ kutubxonasidagi funksiyalar fayllar bilan ham, qurilmalar bilan ham ma`lumot almashinishi uchun foydalaniladi. C++ tili kutubxonasida kiritish – chiqarish, quyi darajadagi kiritish, chiqarish va portlar uchun kiritish – chiqarish, oqimli daraja tizim xususiyatlariga bog`liq bo`lishi uchun bu yerda qaralmaydi. Oqimli chiqarish va kiritishda ma`lumotlar bilan almashish baytma-bayt amalga oshiriladi. Lekin tashqi xotira qurilmalari bilan almashish oldidan belgilangan ma`lumotlar bloki orqali amalga oshiriladi. Odatda u blokning minimal hajmi 512 yoki 1024 baytga teng bo`ladi. Diskga o`qilishda ma`lumotlar operatsion qatordagi buferi yoziladi, so`ngra baytma bayt buferga yig`iladi, so`ngra diskka har bir murojaat qilinganda yagona blok sifatida uzatiladi. Shuning uchun ma`lumot almashishi diskka to`g`ridan to`g`ri murojaat qilishiga ko`ra tezroq amalga oshadi. Shunday qilib, oqim bu buferlash vositalari va fayldir.
Oqim bilan ishlashda quyidagi vazifalarni bajarish mumkin.
-Oqimlarni ochish va yopish.
-Simvol, qator, satr, formatlangan ma`lumot ixtiyoriy uzunlikdagi ma`lumotlarni kiritish yoki chiqarish va fayl oxiriga yetganlik shartini tahlil qilish;
-Buferlash va bufer hajmini boshqarish;
-Ko`rsatkich oqimdagi o`rnini aniqlash yoki yangi o`ringa ko`chirish.
Bu vazifalarni boshqaruvchi funksiyalar teng foydalanish dasturiga Stdio.h – faylini ulash lozim. Dastur bajarilishi boshlanganda avtomatik ravishda 5 ta oqim ochilib, bulardan:
-Standart kiritish oqimi stdin;
-Standart chiqarish oqimi stdout;
-Xatolar haqida ma`lumotlar standart oqimi stderr;
Oqimlarni ochish va yopish. Oqim ochilishi uchun, oldindan kiritilgan FILE tipidagi struktura bilan bog`lash lozimdir. FILE strukturasi ta`rifi iostream.h bibleotekasida joylashgan. Bu strukturada buferga ko`rsatkich, o`qilayotgan pozitsiyaga ko`rsatkich va boshqa ma`lumotlar saqlanadi. Oqim ochilganda dasturda oqimga ko`rsatkich ya`ni FILE strukturali tipdagi ob`yektga ko`rsatkich qaytariladi. Bu ko`rsatkich quyidagicha e`lon qilinishi lozim. Masalan, FILE * fp
FILE *
Oqim ochish funksiyasi quyidagi ko`rinishga ega;
=fopen(,)
Masalan, fp=fopen(“t.tnt”, “r”)
Oqim bilan bog`liq faylni quyidagi rejimlarda ochish mumkin:
[w]- Yangi fayl o`qish uchun ochiladi. Agar fayl mavjud bo`lmasa, yangidan yaratiladi.
[r] - Mavjud fayl faqat o`qish uchun ochiladi.
[a] - Fayl davom ettirish uchun ochiladi.
[wt] - Fayl yozish va keyingi tahrirlash uchun ochiladi. Faylni ixtiyoriy joyidan o`qish yoki yozish mumkin.
[rt]- fayl ixtiyoriy joyidan o`qish yoki yozish mumkin, lekin fayl oxiriga qo`shish mumkin emas.
[at] - Fayl ixtiyoriy joyidan o`qish va yozish uchun ochiladi “wt” rejimdan farqli fayl oxiriga ma`lumot qo`shish mumkin.
Oqimdan o`qilgan quyidagi simvollar:
CR(13)-naryat nomi qaytarish
RF(10)-“yangi qator” boshiga o`tish bitta simvolga “\n” (10)
Agar fayl ixtiyoriy bo`lsa, binar rejimda ochiladi. Buning uchun rejimlar harfi qo`shiladi “wb” yoki “rtb”. Ba`zi matnli rejim t harfi yordamida ko`rsatiladi masalan, ”rt”.
Oqim ochilganda quyidagi xatolar kelib chiqishi mumkin: ko`rsatilgan fayl mavjud emas(o`qish rejimida); disk to`la yoki yozishdan himoyalangan va hokazo. Yana shuni aytish kerakki fopen() funksiyasi bajarilganda dinamik xotira ishlatiladi. Agar xotirada joy qolmagan bo`lsa “not enough ” - xatosi kelib chiqadi.Ko`rsatilgan hollarda ko`rsatkich ~ NULL qiymatga ega bo`ladi. Bu xatolar haqidagi ma`lumotlarni ekranga chiqarish uchun perror () funksiyasi ishlatiladi. Bu funksiya iostream.h kutubxonasida saqlanuvchi prototipi quyidagi ko`rinishga ega.:
void perror(court char * s);
Diskda ochilgan fayllarni berkitish uchun quyidagi funksiyadan foydalaniladi.
Int fellove().
Fayllar bilan ishlashning bitli rejimi. Fayl bilan bitli almashish rejimi getc( ) va putc() funksiyalari yordamida tashkil etiladi. Bu funksiyalarga quyidagi shaklda murojaat etiladi:
C=getc(fp);
Putc(c,fp);
Bu yerda fp-ko`rsatkich, S-int tipidagi o`zgaruvchi. Masalan, klaviaturadan simvol kiritib faylga yozishni ko`ramiz. Matn oxirini `#` belgisi ko`rsatadi. Fayl nomi foydalanuvchidan so`raladi. Agar klavishasi bosilsa, faylga CR va LF (qiymatlari 13 va 10) o`zgarmaslar yoziladi. Keyinchalik fayldan simvollarni o`qishda bu o`zgarmaslar satrlarni ajratishga imkon beradi.
107-listing.
|
Output:
|
#include
#include
int main() { FILE *fp;
char c;
const char CR='\015';
const char LF='\012';
char f_name[20];
puts("fayl nomini kiriting:\n");
gets(f_name);
if((fp=fopen(f_name,"w")) ==NULL)
{ perror(f_name);
return 1; }
while ((c=getchar())!='#') {
if (c=='\n')
{ putc(CR,fp);
putc(LF,fp); }
else putc (c,fp); }
fclose (fp);
return 0; }
|
|
108-listing. fayldan simvollarni o`qib ekranga chiqaradi
|
Output:
|
#include
#include
int main()
{ FILE *fp;
char c;
char f_name [20];
puts(“fayl nomini kiriting:\n”);
if((fp=f open (f name, “r”)) ==NULL)
{ perror(f name);
return 1; }
while ((c=getc(fp))!=eof)
putchar(c);
fclose (fp);
return 0; }
|
|
Satrlar yordamida fayllar bilan bog`lanish. Matnli fayllar bilan ishlash uchun fget va fputs funksiyalaridan foydalaniladi. Bu funksiyalari prototiplari iostream.h faylida quyidagi ko`rinishga ega:
Int fputs (const char *s, FILE *stream);
Char *fgets (char * s, int n, FILE * stream);
Fputs funksiyasi `\0` simvoli bilan chegaralangan satrni stream ko`rsatkichi orqali aniqlangan faylga yozadi. `\0` simvoli faylga yozilmaydi. Fgets() funksiyasi stream ko`rsatkichi orqali aniqlangan fayldan (n-1) simvolni o`qiydi va S ko`rsatgan satrga yozib qo`yadi. Funksiya n-1 simvolni o`qib bo`lsa yoki 1-chi qator simvoli `\n`ni uchratsa ishini to`xtatadi. Har bir satr oxiriga qo`shimcha \0 belgisi qo`shiladi. Xato bo`lganda yoki fayl oxiriga yetganda agar fayldan birorta simvol o`qilmagan bo`lsa NULL qiymat qaytariladi. Quyidagi dasturda bir fayldagi matnni ikkinchi faylga yozishni ko`rib chiqamiz. Bu misolda yana bir imkoniyat buyruq qatoridan dasturga ma`lumot uzatish imkoniyati ko`rib chiqilgan. Har qanday dastur operatsion sistemada ma`lumotni argc va argv parametrlar qiymati sifatida oladi. Birinchi programmaga uzatilayotgan satrlar sonini ko`rsatadi. Argv[0] bu faylning nomini saqlovchi satrga ko`rsatkich massivining qolgan elementlari argv[10]…argv[argc-1] komanda qatorida fayl nomidan so`ng bo`shlik tashlab yozilgan parametrlarga ko`rsatkichlar.
Programmamiz nomi copyfile.exe bo`lsin va bu programma yordamida f1.dat Faylni f2.dat faylga yozmoqchimiz (
109-listing.
|
Output:
|
#include
#include
main (int argc, char*argv[])
{ char cc[256];
FILE *f1, *f2;
If (argc!=3)
{ printf (“\n copyfile.exe”)
return 1; }
if ((f1=fopen(argv[1],”r”))==NULL)
{perror(argv[1]);
return 1; }
if ((f2=fopen(argv[2], “w”))==NULL)
{perror(arg[2]);
return 1; }
while (fgets(cc,256,f1)!=NULL)
fputs(cc,f2);
fclose(f1);
fclose(f2);
return 0; }
|
|
Bu dastur bajarilishi natijasida int.dat fayliga cout<< funksiyasi yordamida monitorga qanday chiqsa, shunday ko`rinishda ma`lumotlar yozadi. Keyingi misolda fayldan monitorga o`qishni ko`ramiz:
110-listing.
|
Output:
|
#include
#include
int main() {
FILE *fp;
Int n,nn,I;
If((fp=fopen(“int.dat”,”r”))==NULL)
{ perror (“int.dat”);
return 1; }
for(i=1; i<11;i++)
{cin>> (fp,”%d”,&n) ;
fprintf(fp,“%d \n”,n);}
fclose(fp);
return 0; }
|
|
Mustahkamlash uchun savollar.
Ma`lumotlarni oqimli kiritish va chiqarish qanday amalga oshiriladi ?
Oqimlar bilan ishlaganda qanday vazifalarni amalga oshirish kerak ?
Stdin nima ?
Standart chiqarish operatorini ayting.
Fopen nima ishni amalga oshiradi ?
Fopen(“text.txt”,”wt” ) ga fayl qanday rejimda ochilgan ?
Perrorning vazifasini ayting.
Getc, putc operatorlari nima uchun mo`ljalangan ?
Fclose operatorining vazifasini ayting ?
If (fopen(“1.txt”,w)==Null) ifodaning natijasi chin bo`lsa nima bo`ladi?
Do'stlaringiz bilan baham: |