[Çözüldü] setvbuf fonksiyonunun size parametresi kullanımı nasıldır?

Başlatan blacksnow, 28 Temmuz 2015 - 15:05:47

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

blacksnow

setvbuf fonksiyonunun nasıl çalıştığını anlamak için örnekler yapıyordum.Aklıma takılan 2 soru var.

1- Yapmak istediğim şey fputs ile buffer' a yazılana diziyi okumak.Oluşturduğum dizi içine 4 karakteri("abc" ve sonundaki '\0' karakterini) alabilecek kapasitede.Fakat setvbuf fonksiyonunun size parametresini 128' in altında yazarsam rastgele karakterler yazıyor.Ama benim buffer' a aktaracağım sadece 4 karakter.Neden istediğim çıktıyı alamıyorum?

2- Ben buffer dizisini oluştururken boyutu belirtiyorum.Tekrar setvbuf ile neden belirtmek zorundayım?

#include <stdio.h>
#include <stdlib.h>
int main ()
{
char buffer[4];
FILE * file;
file = fopen("file", "r+");
setvbuf(file, buffer, _IOLBF, 128);         

fputs("abc", file);
printf("%s\n", buffer);

fclose(file);
return(0);
}


Düzenleme 1:
Alıntı Yapfputs("abc", file);
Burada "abc" dizisinin sonuna '\0' karakteri ekleniyor mu bilmiyorum.Normal bir dizi tanımlarken eklendiği için öyle olduğunu düşündüm.

Düzenleme 2:
Biraz daha araştırdım ve şu cevapları buldum.

1- Anladığım kadarıyla size argümanının kullanılıp kullanılmayacağına derleyici karar veriyor.Benim için size >= 128 olmak zorunda, yoksa olmuyor.Eğer buffer NULL ise herhangi bir sınır olduğunu gözlemlemedim.İstediğim kadar küçük yazabiliyorum size argümanını.Tabii bu sefer setvbuf kendi ayırıyor bellekten yeri.
https://bbs.archlinux.org/viewtopic.php?id=135729

2- setvbuf, buffer dizisini argüman olarak yazdığımda const char * dönüşümü yaptığı için dizinin boyutunu öğrenemiyor.Sanırım bu yüzden.

Amenofis

setvbuf ın dışarıdan verilen diziyi nasıl kullandığı dokumante edilmemiş, zaten gerek yok. Herşeyden önce sen boyutu aslında 4 olan diziye 128 diyerek setvbuf'ı yanıltmış oluyorsun. Bu durumda olabilecek aksiliklerden sen sorumlu olursun.

İkincisi c'de dizilerin boyutunu derleyici sadece derleme anında bilebilir. Çalışma zamanında bunu öğrenmenin bir yolu yok. Bu yüzden fonksiyonlara dizi geçirirken boyutunu da belirtiriz.

blacksnow

Alıntı yapılan: Amenofisİkincisi c'de dizilerin boyutunu derleyici sadece derleme anında bilebilir. Çalışma zamanında bunu öğrenmenin bir yolu yok. Bu yüzden fonksiyonlara dizi geçirirken boyutunu da belirtiriz.
strlen fonksiyonu ile bir dizinin boyutunu çalışma zamanında öğrenebiliriz.Neden öyle dediniz anlamadım.

Amenofis

strlen (string length), sadece stringler için geçerli.