Qo’yi darajadagi kiritish va chiqarish

Qo’yi darajadagi kiritish va chiqarish.
Qo’yi darajadagi kiritish va chiqarish funtsiyalari operatsion tizim imkoniyatlaridan to’g’ridan to’g’ri foydalanishga imkon beradi. Bu holda buferlash va formatlash bajarilmaydi. Faylni qo’yi darajadagi ochishda fayl bilan fayl (oqim) ko’rsatkichi emas, deskriptor bog’lanadi. Fayl deskriptori fayl ochilganligi to’grisidagi ma'lumotni operatsion tizim ichki jadvallariga joylashtiruvini belgilovchi butun sondir. Qo’yi darajadagi funktsiyalar dasturga iostream.h bibliotekasini qo’shishni talab qilmaydi. Lekin bu biblioteka fayllar bilan ishlashda foydali bo’lgan ba'zi konstantalar (misol uchun fayl yakuni belgisi EOF) tarifini uz ichiga oladi. Bu konstatalarda foydalanganda iostream.h dasturga qo’shilishi zarurdir.
56 - DARS. FAYLLARNI OCHISH VA YOPISH.
Fayllarni qo’yi darajadada ochish uchun open () funktsiyasidan foydalaniladi:
int fd= open (fayl nomi, bayroqlar, murojat.)
fd – fayl deskriptori,
fayl nomi – simvollar massiviga ko’rsatkichdir.
2- parametr bayroqlar fayl ochish rejimini belgilovchi ifodadir. Bu ifoda fcntl.h sarlavhali faylda saqlanuvchi konstantalardan biri yoki shu kostantalardan razryadli ‘|’ amali yordamida hosil qilingan bo’lishi mumkin.
Kostantalar ro’yhati:
O_APPEND Faylni ohiriga yozuv qo’shish uchun ochish;
O_BINARY Faylni bitli (ikkili)binar rejimda ochish
O_CREAT Yangi fayl yaratish va ochish
O_EXCL Agar O_CREAT bilan birga ko’rsatilgan bo’lsa va yaratilmoqchi bo’lgan fayl mavjud bo’lsa faylni ochish funktsiyasi hatolik bilan tugaydi. Mavjud faylni o’chib ketmaslikdan saqlaydi.
O_RDONLY Faylni faqat o’qish uchun ochish
O_RDWR Faylni o’qish va yozish uchun ochish
O_TEXT Faylni tekstli rejimda ochish
O_TRUNK Mavjud faylni ochish va bor ma'lumotni o’chirish
Fayl ochilish rejimi albatta ko’rsatilgan bo’lishi shart. 3- parametr murojat huquqlari faqat faylni O_CREAT ochish rejimida ya'ni yangi fayl yaratishda foydalaniladi. MS DOS va MS WINDOWS operatsion tizimlarida murojat huquqlari parametrlarini berish uchun quyidagi konstantalardan foydalaniladi.
S_IWRITE Faylga yozishga ruhsat berish
S_IREAD Fayldan uqishga ruhsat berish
S_ IREAD\ S_WRITE Uqish va yozishga ruhsat berish
Ko’rsatilgan konstantalar sys katalogida joylashgan stat.h sarvlahali faylda saqlanadi. Bu faylni qo’shish # include direktivasi orqali amalga oshiriladi. Agar murojaat huquqi parametri ko’rsatilmagan bo’lsa faqat fayldan o’qishga ruhsat beriladi. UNIX operatsion tizimida murojaat huquqlari 3 hil foydalanuvchilar uchun ko’rsatiladi:
Fayl egasi;
Foydalanuvchilar guruhi a'zosi.
Boshqa foydalanuvchilar
Foydalanuvchilar huquqlari quyidagi simvollar orqali ko’rsatiladi:
R- fayldan uqish ruhsat berilgan.
W- faylga yozish ruhsat berilgan.
X- fayllarni bajarish ruhsat berilgan.
Agar biror murojaat huquqi berilmagan bo’lsa urniga `_` belgisi qo’yiladi. Agar fayl egasiga hamma huquqlar, foydalanuvchi guruhi a'zolariga o’qish va bajarish, boshqa foydalanuvchilarga faqat bajarish huquqi berilgan bo’lsa, murojaat qatorini quyidagicha yozish mumkin rwxr-x—x. Har bir `_` simvol urniga 0 rakami, aks holda 1 raqami qo’yilib hosil bo’lgan sondagi o’ng tomondan boshlab har bir uch raqamini sakkizlik son sifatida yozilsa, murojaat huquqini belgilovchi sakkizlik butun son hosil bo’ladi. Yuqorida hosil qilingan rwxr-x—x qatori ikkilik 111101001 nihoyat sakkizlik 0751 son shaklida yozilib open ( ) funktsiyasida murojaat huquqi parametri sifatida ko’rsatiladi. Faylni ochishga misollar:
1. faylni o’qish uchun ochish:
fd=open ( “ t.txt “ , O_RONLY)
2. faylni o’qish va yozish uchun ochish:
fd = open(“ t.txt “ , O_RDWR)
3. faylni yangi ma'lumotlar yozish uchun ochish:
fd = open(“ new.txt “ ,O_WRONLY_ |O-Creat| O_TRUNK, 0600)
Sakkizlik konstanta 0600 shaklida berilgan murojaat huquqi parametrining simvolli ko’nishi rw -------- bulib, fayl egasiga o’qish va yozish huquqi , qolgan foydalanuvchilarga hech qanday huquq berilmaganligini bildiradi . Faylni ochishda kelib chiqadigan hato turini aniqlash uchun errno.h sarlavhali faylda saqlanuvchi errno o’zgaruvchisi hizmat qiladi. Agar bu o’zgaruvchi qiymati shu sarlavhali faylda saqlanuvchi EEXIST konstantasiga teng bo’lsa ochilayotgan fayl mavjudligini bildiradi.
Sopen ( ) funktsiyasi bitta faylga bir necha dasturlardan murojaat qilish imkonini beradi. Albatta dasturlar faylga faqat o’qish rejimida murojaat qilishi mumkin. Faylni ochish uchun yana Creat ( ) funktsiyasi mavjud bulib qo’yidagi Open ( ) funktsiyasini chaqirishga mos keladi.
Open ( fayl nomi, O_creat |O_TRUNK| O_WRONLY); bu funktsiya yangi fayl yaratadi va yozish uchun ochadi. Qo’yi darajada fayllarni yopish uchun close ( ) funktsiyasidan foydalanish lozim. Bu funktsiya ko’rinishi qo’yidagichadir:
Int close (fayl deskriptori). Funktsiya muvofaqiyatli bajarilganda 0 qaytaradi. Hato bo’lganda – 1.
Ma'lumotlarni o’qish va yozish
Qo’yi darajada ma'lumotlarni kiritish va chiqarish read ( ) va write ( ) funktsiyalari orqali amalga oshiriladi. Bu funktsiyalar prototiplari qo’yidagi ko’rinishga ega:
int read (int fd, char * buffer; unrigned int count)
int write (int fd, char * buffer; unsiqned int count)
Ikkala funktsiya butun o’qilgan yoki yozilgan baytlar sonini qaytaradi. Read funktsiyasi fd deskriptori bilan ochilgan fayldan count parametrida ko’rsatilgan miqdordagi baytlarni o’qib, buffer ko’rsatkichi orqali ko’rsatilgan bufferga yozadi. Fayl ohiriga etganda read () funktsyasi 0 qiymat qaytaradi. Fayldan o’qishda hatolik kelib chiqsa -1 qiymat qaytaradi. O’qish fayldagi joriy pozitsiyadan boshlanadi. Agar fayl matnli rejimda ochilsa CR va LF simvollari `\n` simvoliga o’zgartiriladi.
Write ( ) funktsiyasi fd deskriptori bilan ochilgan faylga buffer ko’rsatkichi orqali ko’rsatilgan bufferdan count parametri orqali ko’rsatilgan miqdordagi baytlarni yozib qo’yadi. Yozuv joriy pozitsiyadan boshlanadi. Agar fayl matnli rejimda ochilgan bo’lsa`\n` simvolini CR va LF simvollar sifatida yoziladi. Agar yozishda hatolik kelib chiqsa, write ( ) funktsiyasi -1 qymat qaytaradi. Errno global o’zgaruvchisi bo’lsa Errno.h sarlavhali faylda ko’rsatilgan qo’yidagi konstantalar biriga teng buladi.
EACCES – fayl yozuvdan himoyalangan
ENOSPC – tashki kurilmada bush joy kolmagan
EBADF – notugri fayl deskriptori
Bu funktsiyalar io.h sarlavhali faylda joylashgandir. Qo’yida bir fayldan ikkinchisiga nusha olish dasturini ko’rib chiqamiz:
programma
#include
#include
#include
int main(int argc, char *argv[ ] )
{
int fdin , fdout; /*Deskriptorih faylov*/
int n; /* Kolichestvo prochitannihh baytov*/
char buff[BUFSIZ];
if (argc !=3)
{
Cout<< (“Format vihzova programmih: ”);
Cout<<(“\n %s fayl_istochnik fayl_priemnik”,
argv[0]);
return 1;
}
if ((fdin =open(argv[1],O_RDONLY)) ==-1)
{
perror (argv[1]);
return 1;
}
if ((fdout=open(argv[2],
O_WRONLY|O_CREAT|O_TRUNC))== -1)
{
perror (argv[2]);
return 1;
}
/* faylih otkrihtih – mojno kopirovat */
while ((n=read(fdin, buff, BUFSIZ))>0)
write (fdout, buff, n );
return 0;
} /* konets programma */
BUFSIZ konstantasi iostream.h sarlavhali faylda aniqlangan bo’lib MS DOS uchun 512 bayt ga teng
|