From: Faik UYGUR (faikuygur@ttnet.net.tr)
Date: Sun 15 Sep 2002 - 11:23:04 EEST
Selam,
> seklinde binary bir dosyayi acip okuma yapmak istiyorum.
> while ((ch = fgetc(dosya)) != EOF)
> seklindeki bir dongu dosya sonuna gelmeden, ch'nin -1 almasiyla sona
> eriyor. Dosya sonunu binary dosyalarda tespit edebilecegim bir komut
> varmi?
fgetc, stream icerisinden bir sonraki karakteri okuyarak, int e cast
edilmis bir unsigned char degeri dondurur. [1]
Bu su demek: limits.h a bakarsaniz unsigned char in tutabilecegi max
deger UCHAR_MAX 255 dir. Minimumda 0 dir.
Yani fgetc, aslinda degeri 0 ile 255 arasinda bir deger iceren
unsigned char donduruyor. Fakat bir sekilde dosya sonunun anlasilmasi
lazim bunun icin de EOF kullaniliyor. Bu sinirlar disinda bir deger
olmali. Yani (0..255) disinda.. Iste bu deger unsigned char in
sinirlari disinda oldugu icin fgetc, int donduruyor. int icerisinde hem
0..255 araligini hemde -1 degerini saklayabiliyoruz. Bu sayede -1
degeri sadece data sonu geldiginde donduruluyor (ya da okurken bir
hata olustugunda) [2]
Fakat siz ch i char tanimladiysaniz, unsigned char 255 degeri
dondugunde bu char icin -1 demek oluyor. EOF ile karsilastirdiginizda
-1 degeri, char in da sinirlari icinde oldugundan esit oluyor. (Bu
karsilastirma isleminde EOF (-1) degerini char tutabildigi icin,
EOF char a promote ediliyor. Standarda bakmak lazim... Ikiside int e
promote ediliyor olabilir ama char -1 tutabildigi icin char yeterli
olmali... tam emin degilim)
Eger unsigned char ch kullanirsaniz daha ilginc bir sey olur. 0 ile 255
arasi degerler geldiginde programiniz devam eder fakat EOF (-1) degeri
dondugunde bu sefer, unsigned char icin -1, 255 oldugundan, ch in degeri
de 255 olur ve EOF ile karsilastirdiginizda birbirlerine esit olmadiklarindan
program sonsuz donguye girer. (Burada iki tarafta karsilastirma
islemi icin, iki degeri de tutabilen int e promote ediliyor.)
Kisaca ch i int yapmalisiniz.
Iyi calismalar,
[1] man fgetc
[2] Ayirt etmek icin feof veya ferror kullaniliyor.
--"The number of UNIX installations has grown to 10, with more expected." -- The UNIX Programmer's Manual, 2nd Edition, June, 1972
-- Attached file included as plaintext by Ecartis --
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux)
iD8DBQE9hENooNVnc1xEeVkRAoXsAJ923HhGPKLL1bIB6U421NAYG9NJkwCdHIC5 v/lAXTFCVbIiFCmdG0pE0Uk= =BD6E -----END PGP SIGNATURE-----