logo

Тўғри мурожаатли файлларни киритишчиқариш. Истисно ҳолатларига ишлов бериш

Yuklangan vaqt:

28.07.2023

Ko'chirishlar soni:

0

Hajmi:

1201.5 KB
Тўғри мурожаатли файлларни киритиш/Тўғри мурожаатли файлларни киритиш/ чиқариш. Истисно ҳолатларига ишлов чиқариш. Истисно ҳолатларига ишлов бериш.бериш. Режа: 1. Faylga ixtiyoriy murojaat qilish 2. Ma’lumotlarni massivga yozish 3. Pozisiyaga oid funksiyalar 4. Murakkab ma’lumotlarni o’qish va yozish. 3 Faylga ixtiyoriy murojaat qilish F unksiyalar faylga ketma-ket yozish yoki ketma-ket o’qishga imkon beradi . Fayldan o’qib faylga yozishlar doim joriy pozisiyada bo’ladi. Boshlang’ich pozisiya fayl ochilganda aniqlanadi. Faylni &#34;r&#34; va &#34;w&#34; rejimida ochilganda joriy pozisiya ko’rsatkichi faylning birligi baytini ko’rsatadi, &#34;a&#34; rejimida ochilganda, o c hish baytini ko’rsatadi. Har bir kiritish-chiqarish amali bajarilganda, ko’rsatkich o’qilgan baytlar soniga qarab yangi pozisiyaga ko’chadi. 4 Faylga ixtiyoriy murojaat qilish F aylda n ma’lumot oqilganda fayl ko’rsatkichi avtomarik ravishda oqilgan yoki yozilgan bayt miqdoricha siljiydi. Fayl ko’rsatkichning joriy pozisiyasini aniqlash uchun ftell ishlatiladi. long ftell (FILE*) Fayl ko’rsatkichini siljiti sh uchun fseek () funksiyasidan foydalani ladi. int fseek (faylga ko’rsatkich, oraliq, hisobot boshi) Hisobot boshi quyidagi konstantalardan biri bilan aniqlanadi : Konstanta Hisobot boshi Izoh SEEK_SET 0 fayl boshi SEEK_CUR 1 o’qilayotgan pozisiya SEEK_ END 2 Fayl oxiri 5 Faylga ixtiyoriy murojaat qilish fseek () funksiyasi 0 qaytaradi agar faylda ko’chish bajarilgan bo’lsa, aksincha noldan farqli songa teng bo’ladi Ixtiyoriy pozisiyadan fayl boshiga o’tish: fseek (fp, ol, SEEK_SET) Ixtiyoriy pozisiyadan fayl boshiga o’tish: fseek (fp, ol, SEEK_END) Joriy pozisiyadan bir bayt oldinga yoki or q aga k o’ chish uchun fseek (jp, -1L, SEEK_CUR). Fayl ko’rsatkichini fayl boshiga ornatish uchun rewind ishlatiladi void rewind (FILE*) Bu amalni fayl ko’rsatkichini siljitish orqali ham amalga oshirish mumkin fseek (f, 0, SEEK_SET). 6 Ma’lumotlarni massivga yozish F ayldan simvollar avval to’g’ri tartibda, so’ngra teskari tartibda o’qi sh int main() { char file[256]; char ch; FILE *fp, *wp; long count, last = 0; puts(&#34;fayl nomini kiriting:\n&#34;); wp = fopen(&#34;output.txt&#34;,&#34;w&#34;); if ((fp = fopen(&#34;input.txt&#34;,&#34;r&#34;)) == NULL) { fprintf (wp, &#34;%s&#34;, &#34;Faylni ochib bo&#39;lmadi\n&#34;); getch(); return 0; }int main() { char file[256]; char ch; FILE *fp, *wp; long count, last = 0; puts(&#34;fayl nomini kiriting:\n&#34;); wp = fopen(&#34;output.txt&#34;,&#34;w&#34;); if ((fp = fopen(&#34;input.txt&#34;,&#34;r&#34;)) == NULL) { fprintf (wp, &#34;%s&#34;, &#34;Faylni ochib bo&#39;lmadi\n&#34;); getch(); return 0; } 7 Ma’lumotlarni massivga yozish F ayldan simvollar avval to’g’ri tartibda, so’ngra teskari tartibda o’qi sh ( davomi ) while(!feof(fp)) { ch = getc(fp); putchar(ch); putchar(&#39;\n&#39;); last++; } for (count = 1L; count <= last; count++) { fseek(fp, -count, SEEK_END); ch = getc(fp); putchar(ch); putchar(&#39;\n&#39;); } fclose(fp); fclose(wp); getch(); }while(!feof(fp)) { ch = getc(fp); putchar(ch); putchar(&#39;\n&#39;); last++; } for (count = 1L; count <= last; count++) { fseek(fp, -count, SEEK_END); ch = getc(fp); putchar(ch); putchar(&#39;\n&#39;); } fclose(fp); fclose(wp); getch(); } To’gri o’qish va yozishTo’gri o’qish va yozish Teskari tartibda o’qishTeskari tartibda o’qish 8 Pozisiyaga oid funksiyalar M isol . F ayl ikkilik rejimda faqat o’qish uchun ochil sin . s o’ngra fayl ko’rsatkichi fayl oxiriga keltirilib, ftell funksiyasi yordamida fayl hajmi aniqlan s i n rewind funksiyasi yordamida fayl ko’rsatkichi fayl boshiga qaytarilib, siklda simvollar ketma-ket fayldan o’qil sin va ekranga chiqaradi. fseek(fp, 0L, SEEK_END); last = ftell(fp); rewind(fp); for (count = 1L; count <= last; count++) { ch = getc(fp); putchar(ch); putchar(&#39;\n&#39;); } fclose(fp); getch(); }fseek(fp, 0L, SEEK_END); last = ftell(fp); rewind(fp); for (count = 1L; count <= last; count++) { ch = getc(fp); putchar(ch); putchar(&#39;\n&#39;); } fclose(fp); getch(); } 9 Murakkab ma’lumotlarni o’qish va yozish. Murakkab ma’lumotlarni kiritish va chiqarish fread( ) va fwrite( ) funksiyalari orqali amalga oshiriladi. Ikkala funksiya butun o’qilgan yoki yozilgan baytlar sonini qaytaradi. size_t fread(void * ptr, size_t size, size_t nmemb, FILE * fp); size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE *fp);size_t fread(void * ptr, size_t size, size_t nmemb, FILE * fp); size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE *fp); fread funksiyasi fayldan ptr ko’rsatkichi adresiga size hajmdagi ma’lumotdan nmemb tani o’qishni amalga oshiradi . Agar o’qish muvaffaqiyatli amalga oshsa fread funksiyasi o’qilgan bloklar soni n ni chiqaradi. O’qish fayldagi joriy pozisiyadan boshlanadi. Aks holda nol chiqaradi. Masalan , fayldan 10 ta double turidagi sonni o’qib, massivga yozish: double earnings[10]; fread(earnings, sizeof (double), 10, fp);double earnings[10]; fread(earnings, sizeof (double), 10, fp); 10 Murakkab ma’lumotlarni o’qish va yozish. fwrite() funksiyasi fp fayl ga ptr ko’rsatkichi adresidan boshlab size hajmdagi malumotdan nmemb tani yozishi amalga oshiradi . Masalan , faylga 10 ta double turidagi sonni massivdan yozish: double earnings[10]; fwrite(earnings, sizeof (double), 10, fp); Faylga 256 bayt ma’lumot yozish: char buffer[256]; fwrite(buffer, 256, 1, fp); double earnings[10]; fwrite(earnings, sizeof (double), 10, fp); Faylga 256 bayt ma’lumot yozish: char buffer[256]; fwrite(buffer, 256, 1, fp); 11 fread() va fwrite() ga misol int main() { int n = 5; double d = 10.77; char s[20]=&#34;acm.tuit.uz&#34;; FILE *f; //binar faylni yozish uchun ochish f=fopen(&#34;binar.dat&#34;, &#34;wb&#34;); //n sonini faylga yozish fwrite(&n, sizeof(int), 1, f); //d sonini faylga yozish fwrite(&d, sizeof(double), 1, f); //satrni faylga yozish fwrite(s, sizeof(char), strlen(s)+1, f); fclose(f); //faylni yopish . . . int main() { int n = 5; double d = 10.77; char s[20]=&#34;acm.tuit.uz&#34;; FILE *f; //binar faylni yozish uchun ochish f=fopen(&#34;binar.dat&#34;, &#34;wb&#34;); //n sonini faylga yozish fwrite(&n, sizeof(int), 1, f); //d sonini faylga yozish fwrite(&d, sizeof(double), 1, f); //satrni faylga yozish fwrite(s, sizeof(char), strlen(s)+1, f); fclose(f); //faylni yopish . . . fwrite() funksiyasi orqali faylga yozish 12 fread() va fwrite() ga misol (davomi) n = 0; d = 0; // hozircha 0 ga teng //binar faylni oqish uchun ochish f=fopen(&#34;binar.dat&#34;, &#34;rb&#34;); //n sonini fayldan o&#39;qish fread(&n, sizeof(int), 1, f); //d sonini fayldan o&#39;qish fread(&d, sizeof(double), 1, f); //satrni faylga yozish fread(s, sizeof(char), strlen(s)+1, f); fclose(f); //faylni yopish cout<<n<<endl<<d<<endl<<s<<endl; getch(); return 0; }n = 0; d = 0; // hozircha 0 ga teng //binar faylni oqish uchun ochish f=fopen(&#34;binar.dat&#34;, &#34;rb&#34;); //n sonini fayldan o&#39;qish fread(&n, sizeof(int), 1, f); //d sonini fayldan o&#39;qish fread(&d, sizeof(double), 1, f); //satrni faylga yozish fread(s, sizeof(char), strlen(s)+1, f); fclose(f); //faylni yopish cout<<n<<endl<<d<<endl<<s<<endl; getch(); return 0; }f read () funksiyasi orqali fayldan o’qish 13 Misol S truktura tur idagi massivni faylga yozish typedef struct { char name[4]; int age; int salary; } employee; int main() { int i; char file[256]; FILE* fp; employee ww[3] = {{&#34;AA&#34;,1,1},{&#34;BB&#34;,2,2},{&#34;CC&#34;,3,3}}; puts(&#34;Fayl nomini kiriting:\n&#34;); if ((fp = fopen(file,&#34;w&#34;)) == NULL) { printf(&#34;Faylni ochib bo&#39;lmadi %s\n&#34;, file); } fwrite(&ww[0],sizeof(employee),3,fp); fclose(fp); }typedef struct { char name[4]; int age; int salary; } employee; int main() { int i; char file[256]; FILE* fp; employee ww[3] = {{&#34;AA&#34;,1,1},{&#34;BB&#34;,2,2},{&#34;CC&#34;,3,3}}; puts(&#34;Fayl nomini kiriting:\n&#34;); if ((fp = fopen(file,&#34;w&#34;)) == NULL) { printf(&#34;Faylni ochib bo&#39;lmadi %s\n&#34;, file); } fwrite(&ww[0],sizeof(employee),3,fp); fclose(fp); } 14 Misol N natural soni berilgan. Elementlari n ta butun sondan iborat bo’lgan faylni hosil qiluvchi va juft elementlarini 2 marta orttiruvchi dastur tuzing. int main(){ int n, k, i; FILE *f; //binar faylni oqish va yozish uchun ochish f = fopen(&#34;binar&#34;, &#34;wb+&#34;); if (f == NULL) { cout <<&#34;Fayl hosil qilishda xatolik&#34;; return 1; } cout<<&#34;n = &#34;; cin>>n; for (i = 0; i < n; i++) { cin>>k; fwrite(&k, sizeof(k), 1, f); } //fayl ko&#39;rsatkichni satr boshiga qo&#39;yish rewind(f); int main(){ int n, k, i; FILE *f; //binar faylni oqish va yozish uchun ochish f = fopen(&#34;binar&#34;, &#34;wb+&#34;); if (f == NULL) { cout <<&#34;Fayl hosil qilishda xatolik&#34;; return 1; } cout<<&#34;n = &#34;; cin>>n; for (i = 0; i < n; i++) { cin>>k; fwrite(&k, sizeof(k), 1, f); } //fayl ko&#39;rsatkichni satr boshiga qo&#39;yish rewind(f); 15 Misol (davomi) while (!feof(f)) // fayl oxiriga bormadimi { fread(&k, sizeof(k), 1, f); if (k % 2 ==0) { k *= 2; // fayl ko&#39;rsatkichni sizeof(int) bayt chapga surish fseek(f, -sizeof(int), SEEK_CUR); fwrite(&k, sizeof(int), 1, f); // fayl korsatkichni o&#39;rnatish fseek(f, ftell(f), SEEK_SET); } } cout<<&#34;Fayl elementlari \n&#34;; rewind(f); //fayl ko&#39;rsatkichni satr boshiga qo&#39;yish while (fread(&k, sizeof(k), 1, f)) cout << k <<endl; fclose(f); return 0; }while (!feof(f)) // fayl oxiriga bormadimi { fread(&k, sizeof(k), 1, f); if (k % 2 ==0) { k *= 2; // fayl ko&#39;rsatkichni sizeof(int) bayt chapga surish fseek(f, -sizeof(int), SEEK_CUR); fwrite(&k, sizeof(int), 1, f); // fayl korsatkichni o&#39;rnatish fseek(f, ftell(f), SEEK_SET); } } cout<<&#34;Fayl elementlari \n&#34;; rewind(f); //fayl ko&#39;rsatkichni satr boshiga qo&#39;yish while (fread(&k, sizeof(k), 1, f)) cout << k <<endl; fclose(f); return 0; } 16 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 . Shunga anaqa yo’l kiraga anaqa pul bering, iltimos . Gul anaqa gulzorda anaqa yaxshi ochiladi . Har bir talaba anaqa besh olishni xoxlaydi. output.txt natija fayli : Oyi derazani yuvdim . Shunga yo’l kiraga pul bering iltimos . Gul gulzorda yaxshi ochiladi . Har bir talaba besh olishni xoxlaydi . 17 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. Barcha &#34; , anaqa , “ so’zni ochiring . 4. Satrni ikkinchi faylga yozish . 5. 2-qadamga o’tish . 6. Ikkala faylni yopish . Ma’lumotlar tugamadimiMa’lumotlar tugamadimi 18 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); } Fayllarga ko’rsatkic hFayllarga 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 19 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 ); } &#34;, anaqa ,“ ni qidirish &#34;, anaqa ,“ ni qidirish 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 20 #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