Оқимли киритиш ва чиқариш. Файллар ва оқимлар. Оқимли киритиш ва чиқаришнинг стандарт файллари ва функциялари

Оқимли киритиш ва чиқариш. Файллар ва оқимлар. Оқимли киритиш ва чиқаришнинг стандарт файллари ва функциялари. Оқимларни бошқариш. Оқимлар ёрдамида файлли киритиш/чиқариш. 2 Oqimli kiritish va chiqarish • Oqimli kiritish va chiqarishda ma’lumotlar bilan almashish baytma- bayt amalga oshiriladi. • F ayldan o’qishda ma’lumotlar operasion tizim buferiga yoziladi, so’ngra baytma-bayt yoki ma’lum porsiyalar bilan foydalanuvchi dasturiga uzatiladi. • F aylga yozishda buferga yig’iladi, so’ngra diskka bir murojaat qilinganda yagona blok sifatida uzatiladi. • Buferlar operativ xotira qismlari sifatida yaratiladi, 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 3 Oqimli kiritish va chiqarish xususiyatlari • Oqimlarni ochish va yopish ; • Simvol, qator , satr, formatlangan ma’lumot ixtiyoriy uz u nlikdagi ma’lumotlarni kiritish yoki chiqarish va fayl oxiriga yetganlik shartini tahlil qilish; • Buferlash va bufer hajmini boshqarish ; • Ko ’ rsatkich oqimdagi o’ rnini ani q lash yoki yangi o’ ringa k o’ chirish Dastur bajarilishi boshlanganda quyidagi oqimlar ochiladi: • stdin - standart kiritish oqimi; // standart input • stdout - standart chiqarish oqimi; //standart output • stderr - Xatolar haqida ma’lumotlar standart oqimi; //standart error 4 Fayllar Fayl – nomga ega bo’lgan diskdagi soha . Fayllar Formatlanmagan matnlarni oladi ACSII (1 baytli simvol UNICODE ( 2 baytli simvol ) *.txt, *.log, *.htm, *.html Jadval kodlaridagi ixtiyoriy simvollarni olishi mumkin *.doc, *.exe, *.bmp, *.jpg, *.wav, *.mp3, *.avi, *.mpgmatnli Ikkilikli Papkalar ( kataloglar ) 5 Sendvich prinsipi I etap . Faylni ochish ( uni ishga tayyorlash va uni faollashtirish) f = fopen(“bir.txt&#34;, “ r &#34;);f = fopen(“bir.txt&#34;, “ r &#34;); II etap : fayl bilan ishlash III etap: faylni yopish fclose ( f ); fclose ( f ); fscanf ( f, &#34;%d&#34;, &n ); // n qiymatini kiritishfscanf ( f, &#34;%d&#34;, &n ); // n qiymatini kiritish fprintf( f, &#34;n=%d&#34;, n ); // n qiymatini yozishfprintf( f, &#34;n=%d&#34;, n ); // n qiymatini yozish( &#34;r&#34; , англ. read ) faqat o’qish uchun f = fopen(“bir.txt&#34;, &#34; w &#34;);f = fopen(“bir.txt&#34;, &#34; w &#34;); ( &#34;w&#34; , англ. write ) faqat yozish uchun f = fopen(“bir.txt&#34;, &#34; a &#34;);f = fopen(“bir.txt&#34;, &#34; a &#34;); ( &#34;a&#34; , англ. append ) faqat yangilash uchun O’zgaruvchi tipi « faylga 6 Oqiml arn i och ish va yopish • Oqim ochilishi uchun , oldindan kiritilgan FILE turidagi strukturasidan foydalaniladi FILE * < k o’ rsatkich nomi > Misol uchun FILE * fp fp = fopen(“t.txt”, “r”) “ w”- Yangi fayl yozish uchun ochiladi. Agar fayl mavjud bo’lmasa yangidan yaratiladi. “ r” - Mavjud fayl faqat o’qish uchun ochiladi. “ a” - Fayl davom ettirish uchun ochiladi. “ w+” - Fayl yozish va tahrirlash uchun ochiladi. Faylni ixtiyoriy joyidan o’qish yoki yozish mumkin. “ r+”- fayl ixtiyoriy joyidan o’qish yoki yozish mumkin, lekin fayl oxiriga qo’ shish mumkin emas. “ a+” - Fayl ixtiyoriy joyidan o’qish va yozish uchun ochiladi. Quyidagi “w+” rej i mdan far q li fayl oxiriga ma’lumot qo’ shish mumkin. 7 Fayllar bilan ishlash Xususiyatlari : • Fayl nomi faqat fopen komandasida keltiriladi, unga murojaat esa f ko’rsatkichi orqali amalga oshiriladi; • O’qilishi kerak bo’lgan fayl mavjud bo’lishi kerak • Agarda yozilishi kerak bo’lgan fayl mavjud bo’lsa, uni ichidagi barcha ma’lumotlar o’chiriladi • Ma’lumotlar matn ko’rinishida faylga yoziladi • Qachonki dastur tugasa avtomatik ravishda barcha fayllar o’chiriladi • Fayl yopilganidan keyin f o’zgaruvchini boshqa fayllar bilan ishlashda foydalanish mumkin 8 Fayllar bilan ishlashga misol (standart) int main() { int a, b; cin>>a>>b; cout<<a+b; getch(); return 0; } freopen (&#34;kfayl.txt&#34;, &#34;r&#34;, stdin); freopen (&#34;chfayl.txt&#34;, &#34;w&#34;, stdout); freopen (&#34;kfayl.txt&#34;, &#34;r&#34;, stdin); freopen (&#34;chfayl.txt&#34;, &#34;w&#34;, stdout); // getch ();// getch (); 9 Ketma-ket murojaat • Fayl ochilganda kursor boshida joylashadi • Faylni o’qish kursor turgan joydan boshlanadi • O’qish boshlangandan so’ng kursor birinchi o’qilmagan simvol tomon harakatlanadi 12 5 45 67 56 ● Fayl oxiri ( end of file , EOF )Fayl oxiri ( end of file , EOF ) 12 5 45 67 56 ●f = fopen(“ikki.txt&#34;, &#34;r&#34;);f = fopen(“ikki.txt&#34;, &#34;r&#34;); fscanf ( f, &#34;%d&#34;, &x );fscanf ( f, &#34;%d&#34;, &x ); Qanday orqaga qaytiladi? ? 10 Faylni ochishdagi xatolik FILE *f; f = fopen(“uch.txt&#34;, &#34; r &#34;); if ( f == NULL ) { puts(“fayl topilmadi . &#34;); return; }FILE *f; f = fopen(“uch.txt&#34;, &#34; r &#34;); if ( f == NULL ) { puts(“fayl topilmadi . &#34;); return; } NULL • faylni nomi noto’g’ri • fayl yo’q • fayl boshqa dastur tomonidan ishlatilmoqda• faylni nomi noto’g’ri • fayl yo’q • fayl boshqa dastur tomonidan ishlatilmoqda Agarda fayl ochilmasa, u holda fopen funksiyasi NULL qiymat chiqaradi (nulli qiymat) !! FILE *f; f = fopen(“turt.txt&#34;, &#34; w &#34;); if ( f == NULL ) { puts(“fayl ochilmadi . &#34;); return; }FILE *f; f = fopen(“turt.txt&#34;, &#34; w &#34;); if ( f == NULL ) { puts(“fayl ochilmadi . &#34;); return; } NULL • fayl nomi noto’g’ri • fayl « faqat o’qish uchun » • fayl boshqa dastur 11 Misol Masala : input.txt faylida sonlar ustun ko’rinishida yozilgan. Ularning soni noma’lum . output.txt faylga ularni summasini yozing . Algoritm : 1. input.txt faylni o’qish uchun ochish . 2. S = 0; 3. x o’zgaruvchiga birin ketin qiymatlarni olib chiqish . 4. Agar qiymat olinmasa 7 -qadamga o’tish . 5. S + = x; 6. 3 -qadamga o’tish . 7. input.txt faylni yopish . 8. output.txt faylni yozish uchun ochish . 9. S ning qiymatini faylga yozish. 10. output.txt faylni yopish . Massivsiz ishlasa bo’ladimi? ? « hali qiymat bormi » s hart sikli« hali qiymat bormi » s hart sikli 12 Sonlar tugaganligini qanday aniqlash mumkin ? FILE *f; int n, x; f = fopen(&#34;input.txt&#34;, &#34;r&#34;) ; ... n = fscanf ( f, &#34;%d&#34;, &x ); if ( n ! = 1 ) puts ( “Sonni o’qib bo’lmadi&#34; );FILE *f; int n, x; f = fopen(&#34;input.txt&#34;, &#34;r&#34;) ; ... n = fscanf ( f, &#34;%d&#34;, &x ); if ( n ! = 1 ) puts ( “Sonni o’qib bo’lmadi&#34; ); fscanf funksiyasi quyidagi qiymatlarni chiqaradi o’qilgan sonlar sonini; 0 , agarda faylni o’qishda xatolik bo’lsa ; – 1 , agarda faylni oxiriga borilsa .! • fayl oxiriga borildi • « sonni » uchratilmadi• fayl oxiriga borildi • « sonni » uchratilmadi 13 Dastur main() { FILE *f; int n, x, S = 0; f = fopen ( &#34;input.txt&#34;, &#34;r&#34; ); if ( f == NULL ) { printf(“Fayl topilmadi . &#34;); getch(); return 0; } while ( 1 ) { n = fscanf ( f, &#34;%d&#34;, &x ); if ( n != 1 ) break; S += x; } fclose ( f ); f = fopen ( &#34;output.txt&#34;, &#34;w&#34; ); fprintf ( f, &#34;S = %d&#34;, S ); fclose ( f ); } Faylni ochishda xatolikFaylni ochishda xatolik a’lumotlarni o’qish sikli : n  1 da chiqish .a’lumotlarni o’qish sikli : n  1 da chiqish . Natijani yozishNatijani yozish 14 Vazifa input.txt faylida noma’lum sondagi butun sonlar berilgan . 1. Undagi barcha sonlarni o’rta arifmetigini toping va natijani output.txt fayliga yozing. 2. Eng katta va eng kichik elementlarini toping va natijani output.txt fayliga yozing . 15 Massivlarni qayta ishlash Masala : input.txt faylda sonlar ustun shaklida berilgan. Soni noma’lum, lekin 100 tadan ko’p emas. Bu sonlarni o’sish output.txt tartibida faylga yozing . Muammo : • Saralash uchun barcha sonlarni xotiraga olish kerak ( massiv ); • Sonlar soni noma’lum . Yechish : 1) Xotiradan 100 ta elementga joy ajrating ; 2) O’qilgan sonlarni massivga yozing va sonni N ga beraing ; 3) assivni N ta elementini saralang ; 4) Ularni faylga yozing . Massivlarni bajarsa bo’ladimi? ? 16 Ma’lumotlarni massivga yozish int ReadArray ( int A[], char fName[], int MAX ) { int N = 0, k; FILE *f; f = fopen ( fName, &#34;r&#34; ); while ( 1 ) { k = fscanf ( f, &#34;%d&#34;, &A[N]); if ( k != 1 ) break; N ++; if ( N >= MAX ) break; } fclose(f); return N ; }Fayldan massivni o’quvchi funksiya massiv elementlar sonini chiqaradi ( kamida MAX ): massivmassiv Agarda o’qish mumkin bo’lmasa sikldan chiqishAgarda o’qish mumkin bo’lmasa sikldan chiqishfayl nomifayl nomi chegar achegar a … yoki massiv to’ldi… yoki massiv to’ldi 17 Dastur main() { int A[100], N, i; FILE *f; N = ReadArray ( A, &#34;input.txt&#34;, 100 ) ; ... // N ta elementni saralash f = fopen ( &#34; output. tx t &#34;, &#34;w&#34; ); for ( i = 0; i < N; i ++) fprintf ( f, &#34;%d\\n&#34;, A[i] ); f close ( f ); }main() { int A[100], N, i; FILE *f; N = ReadArray ( A, &#34;input.txt&#34;, 100 ) ; ... // N ta elementni saralash f = fopen ( &#34; output. tx t &#34;, &#34;w&#34; ); for ( i = 0; i < N; i ++) fprintf ( f, &#34;%d\\n&#34;, A[i] ); f close ( f ); } int ReadArray (int A[], char fName[], int MAX) { ... } saralangan massivni faylga chiqarishsaralangan massivni faylga chiqarish 18 for (i = 0; i < N-1; i ++){ for (j = N-2; j >= i; j --) if (A[j] > A[j+1]) { c = A[j]; A[j] = A[j+1]; A[j+1] = c; } }Saralash algoritmi 19 Vazifa input.txt faylda sonlar ustun shaklida berilgan. Soni noma’lum, lekin 100 tadan ko’p emas. 3. О xirgi raqamini kamayishi bo’yicha massivni saralang va natijani output.txt faylga yozing. 4. Raqamlarni yi’g’indisi bo’yicha massivni saralang va natijani output.txt faylga yozing . 20 Matnli fayllarni qayta ishlash Vazifa : input.txt faylida matn berilgan. Satrda “anaqa” so’zi ko’p ishlatilgan . Matnni bu so’zdan xalos eting va output.txt faylga yozing . input.txt fayli : Oyi , anaqa , derazani , anaqa , yuvdim . Dada , anaqa , yo’l kiraga , anaqa , pul bering, iltimos . Gul , anaqa, gulzorda, anaqa, yaxshi ochiladi . Har bir talaba , anaqa , beshga olishni xoxlaydi. output.txt natija fayli : Oyi darazani yuvdim . Dada yo’l kiraga pul bering iltimos . Gul gulzorda yaxshi ochiladi . har bit talaba besh olishni xoxlaydi . 21 Matnli fayllarni qayta ishlash Muhimligi : Bir vaqtda ikkita faylni ochish lozim ( bittasini o’qish, ikkinchisini yozish uchun ). Algoritm : 1. Ikkala fayl ham ochiq . 2. Satrni o’qish . 3. &#34; , anaqa , “ barcha so’zni ochiring . 4. Satrni ikkinchi faylga yozish . 5. 2-qadamga o’tish . 6. Ikkala faylni yopish . Ma’lumotlar tugamadimiMa’lumotlar tugamadimi 22 Fayllar bilan ishlash main() { char s[80], *p; int i; FILE * fIn, * fOut; fIn = fopen(&#34; in put .txt &#34;, &#34;r&#34; ); f Out = fopen(&#34;output .txt &#34;, &#34;w&#34; ); ... // faylni qayta ishlash f close(fIn); f close(fOut); }main() { char s[80], *p; int i; FILE * fIn, * fOut; fIn = fopen(&#34; in put .txt &#34;, &#34;r&#34; ); f Out = fopen(&#34;output .txt &#34;, &#34;w&#34; ); ... // faylni qayta ishlash f close(fIn); f close(fOut); } Fayllarka ko’rsatkic hFayllarka ko’rsatkic h faylni o’qish uchun ochishfaylni o’qish uchun ochish faylni yozish uchun ochishfaylni yozish uchun ochishQidirish uchun ko’rsatkich Qidirish uchun ko’rsatkich faylni yopish faylni yopish 23 Matnlarni qayta ishlash s satrni o’qish : while ( 1 ) { p = strstr ( s, &#34;, anaqa,&#34; ); if ( p == NULL ) break; strcpy ( p, p + 9 ); } while ( 1 ) { p = strstr ( s, &#34;, anaqa,&#34; ); if ( p == NULL ) break; strcpy ( p, p + 9 ); } qidirish &#34;, anaqa ,&#34;qidirish &#34;, anaqa ,&#34; 9 ta simvolni o’chirish9 ta simvolni o’chirish agar topilmasa sikldan chiqarishagar topilmasa sikldan chiqarish char s[80], *p; FILE *fIn; ... // faylni ochish p = fgets ( s, 80, fIn ); if ( p == NULL ) printf(“fayl tugadi . &#34;); else printf(“O’qilgan satrlar : \\n%s&#34;, s); char s[80], *p; FILE *fIn; ... // faylni ochish p = fgets ( s, 80, fIn ); if ( p == NULL ) printf(“fayl tugadi . &#34;); else printf(“O’qilgan satrlar : \\n%s&#34;, s); s satrni qayta ishlash :satrsatr uzunli giuzunli g 24 #include <string.h> #include <string.h> Fayllarni qayta ishlashni to’liq sikli while ( 1 ) { p = fgets ( s, 80, fIn ); if ( p == NULL ) break; while ( 1 ) { p = strstr ( s, &#34;, anaqa ,&#34; ); if ( p == NULL ) break; strcpy ( p, p + 9 ); } fputs ( s, fOut ); } while ( 1 ) { p = fgets ( s, 80, fIn ); if ( p == NULL ) break; while ( 1 ) { p = strstr ( s, &#34;, anaqa ,&#34; ); if ( p == NULL ) break; strcpy ( p, p + 9 ); } fputs ( s, fOut ); } while ( 1 ) { p = strstr ( s, &#34;, anaqa,&#34; ); if ( p == NULL ) break; strcpy ( p, p + 9 ); } Agarda satr bo’lmasa sikldan chiqarishAgarda satr bo’lmasa sikldan chiqarish Satrni qayta ishlashSatrni qayta ishlash “ tozalangan &#34; satrni yozish“ tozalangan &#34; satrni yozishSatrni o’qishSatrni o’qish 25 Vazifa input.txt f aylda nechtaligi noma’lum bo’lgan satrlar yozilgan . 4: Matndagi barcha « qisqasi » ni « anaqa » ga almashtiring va output.txt faylga yozing. 5: Matndagi barcha « anaqa » ni « qisqasi » ga almashtiring va output.txt faylga yozing.. 26 int main() { FILE *fIn, *fOut; fIn = fopen(&#34;input.txt&#34;, &#34;r&#34;); fOut = fopen(&#34;output.txt&#34;, &#34;w&#34;); string a,b,s,key1=&#34;anaqa&#34;,key2=&#34;yaxshi&#34;; char str[1000]; int i,j,n,l1=key1.size(),l2=key2.size(); bool f; while(fgets(str,1000,fIn)) { s = str; n = s.size(); for(i=0;i<n-l1;i++) { f=1; for(j=0;j<l1;j++) if (s[i+j]!=key1[j]) {f=0; break;} if (f) { s.erase(s.begin()+i,s.begin()+i+l1); s.insert(s.begin()+i,key2.begin(),key2.end()); n = s.size(); i=i+l2 - 1; } } fputs(s.c_str(),fOut); } return 0;} 27 Ikkilik fayllari Muhimligi : • Ma’lumotlar mashina formati da saqlanadi ( matnli redaktorda o’qib bo’lmaydi ) • Xotiradan biror qismini o’qishimiz va yozishimiz mumkin ( faqat bitlarda …) • Sendvich prinsipi ( ochish – ishlash – yopish ) • Faylga ko’rsatkich orqali murojaat. Faylli ko’rsatkich FILE *fp; FILE *fp; 28 Ikkilik faylni ochish va yopish Faylni ochish fp = fopen ( &#34;input.dat&#34;, &#34;rb&#34; ); fp = fopen ( &#34;input.dat&#34;, &#34;rb&#34; ); &#34;rb&#34; = read binary (oqish ) &#34;wb&#34; = write binary (yozish ) &#34;ab&#34; = append binary (qo’sish )&#34;rb&#34; = read binary (oqish ) &#34;wb&#34; = write binary (yozish ) &#34;ab&#34; = append binary (qo’sish ) Ochishdagi xatolik if ( fp == NULL ) { printf(“fayl ochilmadi . &#34;); } if ( fp == NULL ) { printf(“fayl ochilmadi . &#34;); } Faylni yopish fclose ( fp ); fclose ( fp ); 29 Blok bo’yicha o’qish Massiv boshidan o’qish int A[100]; n = fread ( A, sizeof(int), 100, fp ); int A[100]; n = fread ( A, sizeof(int), 100, fp ); Xotiradagi manzil (« qaerga »): A  &A[0]Xotiradagi manzil (« qaerga »): A  &A[0] Bitta blok o’lchamiBitta blok o’lchami Butun tipli o’zgaruvchi o’lchamiButun tipli o’zgaruvchi o’lchami Bloklar soniBloklar soni Faylga ko’rsatkich Faylga ko’rsatkich O’qilganlarO’qilganlar Massiv o’rtasidan o’qish int A[100]; n = fread ( A +5 , sizeof(int), 2 , fp ); int A[100]; n = fread ( A +5 , sizeof(int), 2 , fp ); 2 ta butun son o’qiladi : A[ 5 ] , A[ 6 ]2 ta butun son o’qiladi : A[ 5 ] , A[ 6 ] 30 Bloklar bo’yicha o’qish Vassiv boshidan yozish int A[100]; n = fwrite( A, sizeof(int), 100, fp ); int A[100]; n = fwrite( A, sizeof(int), 100, fp ); Xotiradagi soha manzili (« qayerdan »): A  &A[0]Xotiradagi soha manzili (« qayerdan »): A  &A[0] Bitta blok o’lchamiBitta blok o’lchami Butun tipli o’zgaruvchi o’lchamiButun tipli o’zgaruvchi o’lchami Bloklar soniBloklar soni Faylga ko’rsatkich Faylga ko’rsatkich yozilganlaryozilganlar Massivni alohida elementlarini yozish int A[100]; n = fwrite( A +5 , sizeof(int), 2 , fp ); int A[100]; n = fwrite( A +5 , sizeof(int), 2 , fp ); 2 ta butun son o’qiladi : A[ 5 ] , A[ 6 ]2 ta butun son o’qiladi : A[ 5 ] , A[ 6 ] 31 Matrisa bilan ishlash Xotirada saqlash : satr bo’yicha (С, Paskal ) 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 Matrisalarga yozish int A[ 3 ][3]; FILE *fp = fopen(&#34;output.dat&#34;, &#34;wb&#34;); ... // matrisani to’ldirish n = fwrite( A, sizeof(int), 9, fp ); int A[ 3 ][3]; FILE *fp = fopen(&#34;output.dat&#34;, &#34;wb&#34;); ... // matrisani to’ldirish n = fwrite( A, sizeof(int), 9, fp ); 32 Misol Masala : input.dat fayldagi massiv elementlarini o’qing va ularni 2 ga ko’paytirib natijani faylga output.dat yoizing. Dastur tuzilish : #include <stdio.h> main() { const int N = 10; int i, A[N], n; FILE *fp; // input.dat faylidan o’qish for ( i = 0; i < n; i ++ ) A[i] = A[i] * 2; // output.dat fayliga yozish }#include <stdio.h> main() { const int N = 10; int i, A[N], n; FILE *fp; // input.dat faylidan o’qish for ( i = 0; i < n; i ++ ) A[i] = A[i] * 2; // output.dat fayliga yozish } O’qilganlarO’qilganlar 33 Fayllar bilan ishlash fp = fopen( &#34;input.dat&#34;, &#34;rb&#34; ); if ( fp == NULL ) { printf(“fayl ochilmadi . &#34;); return; } n = fread ( A, sizeof(int), N, fp ); if ( n < N ) printf(“ faylda ma’lumotlar etishmayapdi &#34;); fclose ( fp );fp = fopen( &#34;input.dat&#34;, &#34;rb&#34; ); if ( fp == NULL ) { printf(“fayl ochilmadi . &#34;); return; } n = fread ( A, sizeof(int), N, fp ); if ( n < N ) printf(“ faylda ma’lumotlar etishmayapdi &#34;); fclose ( fp );Ma’lumotlarni o’qish : fp = fopen( &#34;output.dat&#34;, &#34;wb&#34; ); fwrite ( A, sizeof(int), n, fp ); fclose ( fp );fp = fopen( &#34;output.dat&#34;, &#34;wb&#34; ); fwrite ( A, sizeof(int), n, fp ); fclose ( fp );Ma’lumotlarni yozish : kritik xatolikkritik xatolik kritik bo’lmagan xatolik kritik bo’lmagan xatolik qanc