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> > setvbuf

setvbuf() fonksiyonu

Bildirim

int setvbuf(FILE *stream, char *buffer, int mode, size_t size);

Açıklama

Dosya akışı ara belleğini değiştirir. Akış için bir ara bellek tanımlar. Fonksiyon, ara bellek modunu ve boyutunu (byte cinsinden) belirler.

Buffer parametre değeri NULL bir değer ise, fonksiyon size parametre değerini kullanarak otomatik olarak bir ara bellek ayırır. Aksi takdirde, buffer ile gösterilen dizi boyutu bellek boyut olarak kullanılı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.

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: Açık bir dosya akışını tanımlayan FILE nesnesi işaretçisidir.

buffer: Kullanıcı tarafından tanımlanan ara belelktir. En az size parametre değeri kadar boyuta sahip olmalıdır.

mode: Dosya ara bellek işlemleri için aşağıdaki değerlerden birini mod olarak tanımlar.

_IOFBF: Komple ara bellek işlemi: Dosyaya yazma işlemlerinde, arabellek dolduğunda veya fflush() fonksiyonu kullanıldığında, veriler yazılır. Dosyadan okuma işlemlerinde, bir okuma işlemi yapıldığında ve ara bellek boş olduğunda ara bellek doldurulur.

_IOLBF: Satır ara bellek işlemi: Dosyaya yazma işlemlerinde, veri akışına yeni satır karakteri eklendiğinde veya arabellek dolduğunda veya fflush() fonksiyonu kullanıldığında veriler yazılır. Dosyadan okuma işlemlerinde, bir okuma işlemi yapıldığında ve ara bellek boş olduğunda ara bellek bir sonraki satır sonu karakterine kadar doldurulur.

_IONBF Ara belleksiz işlem: Ara bellek kullanılmaz. Her Giriş/Çıkış işlemi en kısa sürede yazılır. Bu durumda, buffer ve size parametreleri dikkate alınmaz.

size: Buffer parametresini boyutunu byte olarak gösterir. Eğer buffer parametresi NULL bir değer içerirse, bu değer fonksiyonunun tahsis edeceği ara bellek boyutunu belirler.

Dönüş değeri

Başarı durumunda ​0​ değeri, hata durumunda sıfır olmayan bir değer geri döndürülür.

Örnek


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp1, *fp2;
    char gdizi[40];

    if ((fp1 = fopen ("dosya.txt", "w+")) == NULL) {
         printf("Dosya açma hatası!");
         exit(1);
    }

    setvbuf (fp1, NULL, _IOFBF, 1024);

    fputs("Bilgisayar", fp1);

    /* Dosya içeriğini okuma ve ekrana yazma */
    if ((fp2 = fopen ("dosya.txt", "r")) == NULL) {
         printf("Dosya açma hatası!");
         exit(1);
    }
    printf("Dosya içeriği: %s\n", fgets(gdizi, 40, fp2) != NULL ? gdizi : "");

    fclose(fp2);

    fflush(fp1); /* Ara belleği dosya.txt dosyasına yazar. */

    /* Dosya içeriğini okuma ve ekrana yazma */
    if ((fp2 = fopen ("dosya.txt", "r")) == NULL) {
         printf("Dosya açma hatası!");
         exit(1);
    }
    printf("Dosya içeriği: %s\n", fgets(gdizi, 40, fp2) != NULL ? gdizi : "");

    fclose(fp1);
    fclose(fp2);

    return 0;
}

Yukarıdaki örnekte, program aşağıdaki satırı ekrana yazar:

Dosya içeriği:
Dosya içeriği: Bilgisayar

Yukarıdaki program, okuma ve yazma modunda (w+) 2 adet dosya açar. İlk dosyaya doğrudan ikinci dosyaya ise setbuf() fonksiyonu ile ara bellek tanımladıktan sonra fputs() fonksiyonu ile birer karakter dizisi yazar. Karakter dizisini ara bellekten alarak fiziksel olarak ikinci dosyaya yazmak için fflush() fonksiyonunu kullanır. Bir dosya akışı ile herhangi bir işlem yapmadan önce setbuf() fonksiyonu ile bir ara bellek ayarlandığında, dosyay yapılan yazma işlemi ara belleğe alınır. Dosyaya yazma işleminin yapılabilmesi için fflush() fonksiyonunun kullanılması, dosyanın kapatılması veya programın normal bir şekilde çalışmasının sona ermesi gerekir.