Informatika darsliklarining uzviyligi va uzluksizligi
Oqimlar yordamida ma’lumotlarni kiritish va chiqarishni dasturlash Reja 1. Oqimli kiritish va chiqarish 2. Satrlar yordamida fayllar bilan bog`lanish 3. Ishlab chiqarishni optimal rejalashtirish masalasi
Oqimli kiritish va chiqarish 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 ochilishi uchun, oldindan kiritilgan FILE tipidagi struktura bilan boglash 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'ektga ko’rsatkich qaytariladi. Bu ko’rsatkich qo’yidagicha e'lon qilinishi lozim. FILE * <kursatkich nomi> Misol uchun FILE * fp Oqim ochish funktsiyasi quyidagi ko’rinishga ega; <oqimga ko’rsatkich nomi>=foren(<fayl-nomi>,<ochish rejimi>) Misol uchun:fp=fopen(“t.tnt”, “r”) Oqim bilan bog’lik faylni qo’yidagi 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 da'vom ettirish uchun ochiladi. “wt” - Fayl yozish va keyingi tahrirlash uchun ochiladi. Fayl ihtiyoriy joyidan o’qish yoki yozish mumkin. “rt”- fayl ihtiyoriy joyidan o’qish yoki yozish mumkin, lekin fayl ohiriga qo’shish mumkin emas. “at” - Fayl ihtiyoriy joyidan o’qish va yozish uchun ochiladi “wt” rejmdan farqli fayl ohiriga ma'lumot qo’shish mumkin. Oqimdan o’qilgan qo’yidagi simvollar ------- CR(13)-naryat nomi qaytarish RF(10)-“yangi qator” boshiga o’tish bitta simvolga “\n” (10) fqkfynbhbkflb/ Agar fayl------- emas ihtiyoriy bulsa, binar rejimda ochiladi. Buning uchun rejimlar--------- harfi qo’shiladi ------- “wb” yoki “rtb”. Ba'zi ----- matnli rejim t harifi yordamida ko’rsatiladi masalan “yoki”rt”. Oqim ochilganda quyidagi hatolar kelib chiqishi mumkin:ko’rsatilgan fayl mavjud emas(o’kish rejimida); disk to’la yoki yozishdan himoyalangan va hokazo. Yana shuni aytish kerakki fopen() funktsiyasi bajarilganda dinamik hotira ishlatiladi. Agar hotirada joy qolmagan bo’lsa “not enough ” - hatosi kelib chiqadi. Ko’rsatilgan hollarda ko’rsatkich ~ NULL qiymatga ega bo’ladi. Bu hatolar haqidagi ma'lumotlarni ekranga chiqarish uchun perror () funktsiyasi ishlatiladi. Bu funktsiya iostream.h bibliotekasida saqlanuvchi prototipi qo’yidagi ko’rinishga ega.: Void perror(court char * s); Diskda ochilgan fayllarni berkitish uchun qo’yidagi funktsiyadan foydalaniladi. Int fellove(<oqimga-kursatkich nomi>). Fayllar bilan ishlashning bitli rejimi. Fayl bilan bitli almashish rejimi getc( ) va putc( ) funktsiyalari yordamida tashkil etiladi. Bu funktsiyalarga qo’yidagi shaklda murojat etiladi: C=getc(fp); Putc(c,fp);
Bu erda fp-ko’rsatkich S-int tipidagi o’zgaruvchi Misol tariqasida klaviaturadan simvol kiritib faylga yozishni ko’ramiz. Matn ohirini ‘#’ belgisi ko’rsatadi. Fayl nomi foydalanuvchidan so’raladi. Agar <enter> klavishasi bosilsa faylga CR va LF (qiymatlari 13 va 10) konstantalar yoziladi. Keyinchalik fayldan simvollarni uqishda bu konstantalar satrlarni ajratishga imkon beradi. #include <iostream.h> 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=f open(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;