Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /var/www/vhosts/bilgigunlugum.net/httpdocs/index.php on line 43
C Programlama

BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C Programlama > C standart kütüphanesi > <stdio.h> > setbuf

setbuf() fonksiyonu

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.