Dizge Akımları
Önceki Diğer Akım Çeşitleri Sonraki
Dizge Akımları
Bir dizge ya da bellek tamponu ile veri alışverişini mümkün kılan fmemopen ve open_memstream işlevleri stdio.h başlık dosyasında bildirilmiştir.
FILE *fmemopen
(void       *tampon,
 size_t      boyut,
 const char *açıştürü)
işlev
Bu işlev tampon tamponu ile belirtilen tamponu kullanan ve açıştürü argümanında belirtilen erişimi mümkün kılan bir akım açar. tampon olarak belirtilen dizi en az boyut bayt uzunlukta olmalıdır.
tampon olarak bir boş gösterici belirtirseniz fmemopen işlevi boyut bayt uzunlukta bir diziyi (malloc kullanarak; bkz. Özgür Bellek Ayırma) özdevimli ayırırır. Bu genelikle sadece tampona bazı şeyleri yazdıktan hemen sonra okumak isterseniz kullanışlıdır. Çünkü aslında tampona bir gösterici almanın bir yolu yoktur (bunun için aşağıdaki open_memstream işlevini deneyin). Tampon, akım kapatıldığında serbest bırakılır.
açıştürü argümanı fopen işlevindeki gibi belirtilir (bkz. Akımların Açılması). açıştürü ekleme kipinde belirtilirse, ilk dosya konumu tampondaki ilk boş karaktere ayarlanır. Aksi takdirde ilk dosya konumu tamponun başlangıcıdır.
Bir akım yazmak için açılırken boşaltılır ve kapatılır, bir boş karakter (sıfır baytı) yer varsa tamponun sonuna yazılır. Bunun için boyut argümanını tasarlarken bir ek baytı gözönüne almalısınız. Tampona boyut bayttan daha fazlası yazılmak istendiğinde bir hata oluşacaktır.
Okumak için açılan bir akım için tampondaki boş karakterler (sıfır baytları) dosyanın sonu olarak ele alınmaz. Okuma işlemlerinde sadece dosya konumu boyut bayt ilerlediğinde dosya sonu olarak değerlendirilir. Bu durumda karakterleri bir boş karakter sonlandırmalı dizgeden okumak isterseniz boyut baytlık bir dizge sağlamanız gerekir.
Aşağıdaki örnekte bir dizgeden okuma yapmak için fmemopen kullanarak bir akım açılmaktadır:
#include <stdio.h>

static char tampon[] = "deneme";

int
main (void)
{
  int ch;
  FILE *akim;

  akim = fmemopen (tampon, strlen (tampon), "r");
  while ((ch = fgetc (akim)) != EOF)
    printf ("%c okundu\n", ch);
  fclose (akim);

  return 0;
}
Bu kod parçası aşağıdaki çıktıyı üretir:
d okundu
e okundu
n okundu
e okundu
m okundu
e okundu
FILE *open_memstream
(char  **gstr,
 size_t *boyut)
işlev
Bu işlev bir tampona yazmak için bir akım açar. Tampon (malloc kullanılarak özdevimli ayrılır ve gerektikçe büyütülür. Akımı kapattıktan sonra bu tamponun free veya realloc kullanarak temizlenmesi sizin sorumluluğunuzdadır. Bkz. Özgür Bellek Ayırma.
Akım fclose ile kapatıldığında ya da fflush ile boşaltıldığında, gstr tampona bir gösterici olarak ve boyutu da boyut değişkenine güncellenir. Buralarda saklanmış olan değerler akımda başka bir değer yer alıncaya kadar geçerli kalır. Başka çıktılar almak için kullanmadan önce akımı boşaltmalısınız.
Tamponun sonuna bir boş karakter yazılır. Bu boş karakter boyut değerine dahil edilmez.
Akımın dosya konumunu fseek veya fseeko (Dosyalarda Konumlama) işlevlerini kullanarak değiştirebilirsiniz. Dosya konumunun yazılmış verinin sonrasına taşınması halinde arada kalan boşluklar sıfırlarla doldurulur.
Aşağıda open_memstream işlevi kullanılan bir örnek görüyorsunuz:
#include <stdio.h>

int
main (void)
{
  char *bp;
  size_t size;
  FILE *stream;

  stream = open_memstream (&bp, &size);
  fprintf (stream, "merhaba");
  fflush (stream);
  printf ("buf = `%s', size = %d\n", bp, size);
  fprintf (stream, ", dostlar");
  fclose (stream);
  printf ("buf = `%s', size = %d\n", bp, size);

  return 0;
}
Bu kod parçası aşağıdaki çıktıyı üretir:
buf = `merhaba', size = 7
buf = `merhaba, dostlar', size = 16
Önceki Üst Ana Başlık Sonraki
Diğer Akım Çeşitleri Başlangıç Yığınak Akımları
Bir Linux Kitaplığı Sayfası