setbuf(), setvbuf(), fflush()

Kategori: C , 30 Haziran 2019 , JanFranco


Bir I/O operasyonu yaptığımızda, gönderdiğimiz input veya aldığımız output anında işlenemez. Buffering denilen bir teknikle bir yerde depolanır ve parça parça gönderilir. Bu şekilde alan ve gönderen arasında bir hız farkı var ise hatalar engellenmiş ve performanslı bir iş yapılmış olur. Biz setbuf ve setvbuf fonksiyonları ile bu buffer'ın özelliklerini değiştirebiliriz. Buffering kavramı daha derin bir konudur bu dökümantasyonda basit bir şekilde anlatılmıştır. Fonksiyon prototipleri:


void setbuf(FILE *stream, char *buf);
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
setbbuf fonksiyonu setvbuf fonksiyonunun basit modelidir. İki fonksiyon da ilk parametre olarak bir file pointer alır. İkinci parametre olarak buf alanını alırlar. malloc fonksiyonu bir yer açılıp, parametre olarak gönderilebilir. setvbuf fonksiyonu ek olarak 2 parametre daha alır. Bunlar mod ve size parametreleridir. Modlardan aşağıda bahsedilmiştir. Size parametresi ise gelecek olan verinin büyüklüğüdür. Modlar:

_IOFBF	->   Fully buffered, full buffering yapılacak
_IOLBF	->   Line buffered, satır bazlı buffering yapılacak
_IONBF	->   Unbuffered, buffering yapılmayacak
setbuf fonksiyonu ile setvbuf fonksiyonlarını karşılaştıralım:

setbuf(stream, buf);
setvbuf(stream, buf, _IOFBF, BUFSIZ);
Full buffered yapılmıştır ve bu iki satır aynı işi yapmakta, aynı anlama gelmektedir.

setbuf(stream, NULL);
setvbuf(stream, NULL, _IONBF, BUFSIZ);
Unbuffered yapılmıştır ve iki satır denktir, aynı işi yapar. Son olarak bir örnek yapalım:

FILE *fp;
char lineBuf[1024];

fp = fopen("somefile.txt", "r");
setvbuf(fp, lineBuf, _IOLBF, 1024);

// ...

fclose(fp);

fp = fopen("another.dat", "rb");
setbuf(fp, NULL);

// ...

fclose(fp);
Burada somefile.txt dosyası line buffered olarak okunmuştur. another.dat dosyası buffered yapılmadan okunmuştur. Buffering işleminin bir dezavantajı vardır. Dosyalar anında yazılmadığından, bir sistem kesintisinde vs. veya anında erişmek istediğimiz yerlerde sıkıntı çıkarır. Bunun önüne geçebilmek için fflush fonksiyonunu kullanabiliriz. fflush fonksiyonu bufferda saklanan veriyi direk olarak nereye gönderilecekse tümünü gönderir. Fonksiyon prototipi:

int fflush(FILE *stream);


Sonraki Yazı: strlen()
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın