Bildirim
void setbuf(FILE *stream, char *buffer);
Açıklama
Dosya akışı işlemleri için ara bellek kullanımı düzenlemesi yapar. Buffer parametre değeri kadar ara bellek tanımlar. Eğer buffer parametre değeri NULL bir değer ise, dosya akışı için ara bellek devre dışı kalır.
Bu fonksiyon dosya akışı ile ilgili herhangi bir giriş veya çıkış işlemi gerçekleştirilmeden önce çağrılarak akışa bağlantı yapılmalıdır.
Arabellek boyutunun en az BUFSIZ byte kadar olduğu kabul edilir.
Akış ara bellekleri fflush() fonksiyonu çağrılarak dosyaya yapılan yazma veya okuma işlemleri sonuçlandırılır. Ayrıca, fclose() ve freopen() fonksiyonları çağrıldığında veya program normal şekilde sona erdiğinde ara bellek otomatik olarak temizlenir.
Parametreler
stream: Ara bellek tanımlanacak akışı tanımlayan FILE nesnesi işaretçisidir.
buffer: Dosya akışı tarafından kullanılacak ara bellek işaretçisidir.
Dönüş değeri
Yok.
Örnek
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp1, *fp2, *fp3;
char cdizi1[1024], cdizi2[1024];
char gdizi[40];
if ((fp1 = fopen ("dosya1.txt", "w+")) == NULL) {
printf("Dosya açma hatası!");
exit(1);
}
if ((fp2 = fopen ("dosya2.txt", "w+")) == NULL) {
printf("Dosya açma hatası!");
exit(1);
}
setbuf (fp1, cdizi1);
setbuf (fp2, cdizi2);
fputs("Bilgisayar", fp1);
fputs("Programlama", fp2);
printf("cdizi1 ara bellek içeriği: %s\n", cdizi1);
printf("cdizi2 ara bellek içeriği: %s\n", cdizi2);
/* dosya1.txt içeriğini okuma ve ekrana yazma */
if ((fp3 = fopen ("dosya1.txt", "r")) == NULL) {
printf("Dosya açma hatası!");
exit(1);
}
printf("dosya1.txt içeriği: %s\n", fgets(gdizi, 40, fp3) != NULL ? gdizi : "");
/* dosya2.txt içeriğini okuma ve ekrana yazma */
if (freopen("dosya2.txt", "r", fp3) == NULL) {
printf("FILE dosya değişimi gerçekleşmedi!\n");
exit(1);
}
printf("dosya2.txt içeriği: %s\n", fgets(gdizi, 40, fp3) != NULL ? gdizi : "");
fclose(fp3);
fflush(fp1); /* Ara belleği dosya1.txt dosyasına yazar. */
fclose(fp2); /* Ara belleği dosya2.txt dosyasına yazar. */
/* Dosya içeriklerini tekrar okuma ve yazma */
/* dosya1.txt içeriğini okuma ve ekrana yazma */
if ((fp3 = fopen ("dosya1.txt", "r")) == NULL) {
printf("Dosya açma hatası!");
exit(1);
}
printf("dosya1.txt içeriği: %s\n", fgets(gdizi, 40, fp3) != NULL ? gdizi : "");
/* dosya2.txt içeriğini okuma ve ekrana yazma */
if (freopen("dosya2.txt", "r", fp3) == NULL) {
printf("FILE dosya değişimi gerçekleşmedi!\n");
exit(1);
}
printf("dosya2.txt içeriği: %s\n", fgets(gdizi, 40, fp3) != NULL ? gdizi : "");
fclose(fp1);
fclose(fp2);
fclose(fp3);
return 0;
}
Yukarıdaki örnekte, program aşağıdaki satırları ekrana yazar:
cdizi1 ara bellek içeriği: Bilgisayar cdizi2 ara bellek içeriği: Programlama dosya1.txt içeriği: dosya2.txt içeriği: dosya1.txt içeriği: Bilgisayar dosya2.txt içeriği: Programlama
Yukarıdaki program, okuma ve yazma modunda (w+) 2 adet dosya açar. Her iki dosya için setbuf() fonksiyonu ile 1024 byte uzunluğunda birer ara bellek tanımladıktan sonra, fputs() fonksiyonu ile birer karakter dizisi yazar. Ancak yazma işlemi ara bellek yöntemi ile yapıldığından ara bellek içerikleri doldurulur ancak dosyalara fiziksel olarak bir değer yazılmaz. Ara bellek içeriklerini dosyalara yazmak amacıyla, ilk dosya için fflush() fonksiyonu ikinci dosya için fclose() fonksiyonu ile kapatma işlemi uygulanır. Daha sonra, her iki dosya içeriği tekrar ekrana yazılır.