logo

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

Yuklangan vaqt:

28.07.2023

Ko'chirishlar soni:

0

Hajmi:

1150.5 KB
 Оқимли киритиш ва чиқариш. Файллар ва оқимлар. Оқимли киритиш ва чиқаришнинг стандарт файллари ва функциялари. Оқимларни бошқариш. Оқимлар ёрдамида файлли киритиш/чиқариш. 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 ko’rsatkich »: FILE *f;O’zgaruvchi tipi « faylga ko’rsatkich »: FILE *f; 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 tomonidan ishlatilmoqda• fayl nomi noto’g’ri • fayl « faqat o’qish uchun » • fayl boshqa dastur tomonidan ishlatilmoqda 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 gi faylfayl 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 qancha o’qildiqancha o’qildi