PDA

Tam Sürümünü Görmek İçin : Dosya Islemleri


quasimodo
22/03/2007, 21:53
Biz bir dosyaya

int a = 254;
int b = 1;

sayilarini gonderdigimizde, bu iki sayi turlerinin ayni olmasina ragmen
dosyada farkli byte larde yer kapliyacak
a sayisi 4 byte ,
b sayisi 1 bayt
fakat ben bu degiskenleri

unsigned char a = 254;
unsigned char b = 1;

seklinde tanimlarsam bu sayilar dosyada ayni uzunluktami yer tutacak...?


acehreli
22/03/2007, 22:02
Nasil yazdigini gostermiyorsun ama onceki orneginden anlasildigina gore, evet, butun 'unsigned char'lar ayni uzunlukta yer tutacak. O da 'char' ile ayni uzunlukta olacak, o da 1'dir... :)

Ali

quasimodo
22/03/2007, 22:15
Peki butun integerlari ayni boyutta yer kapliyacak
sekilde dosyaya yazdirmak mumkunmu ?

Yani integerlar 4 byte tir(en azindan bende ole) dosyada
da butun integerler 4 byte yer kapliyacak ...

acehreli
22/03/2007, 22:29
Bu nasil yazdirdigina gore degisir. Eger 'binary' olarak yazdirirsan, evet butun int'ler sende 4 bayt tutarlar.

Ama eger ornegin bir XML formatta yazdirirsan, 100 bayt bile tutabilirler. :p

Ali

Revlis
23/03/2007, 00:50
Peki butun integerlari ayni boyutta yer kapliyacak
sekilde dosyaya yazdirmak mumkunmu ?

Yani integerlar 4 byte tir(en azindan bende ole) dosyada
da butun integerler 4 byte yer kapliyacak ...

Değişkenleri byte,integer gibi tiplere ayırmanın mantığı zaten budur. Bellekte 4byte kaplayan değişken dosya da da 4byte kaplayacaktır. Yoksa dosyayı okumak imkansız olur.

eezgu
23/03/2007, 16:50
dosyayı binary modda açarsan karakter olarak uzunluğundan bağımsız olarak değişkenler bellekteki gibi dosyaya yazılır. o zaman değişkenlerin bellekte kapladığı yer ile dosyada kapladığı yer aynı olur.

quasimodo
24/03/2007, 21:42
I-) fwrite() komutuyla bir text dosyasina bir integer yazdirdigimda
ve o dosyanin icine daha sonra baktigimda (windows tan)
gorduklerim 00FC gibi hex sayilar olur ? Bunun dosya acma
moduyla alakasi olmasa gerek yani binary modda acmam
gerekmiyor degilmi ?

II-)
#include <stdio.h>

int main()
{
int sayi;

printf("bir sayi : ");
scanf("%d", &sayi);

return 0;
}

consol ekraninda bir sayi : yazisi ciktiktan sonra yazdigim
sayi once buffer a gidiyor daha sonra buffer den sayi degiskeninin
adresine gidiyor degilmi?

Bu buffer en fazla kac byte tutabiliyor yani bufferin dolmasi ne zaman soz konusu oluyor?

acehreli
26/03/2007, 19:43
'Text mode'unda acilan C akimlarina yazdirilan karakterler, bulundugun ortama gore bir dOnUsUmden gecirilirler. DOnUsum olmasini istemiyorsan dosyayi 'binary mode'da acman gerekir.

Su ornek, ayni degeri dosyayi iki degisik modda acarak yazdiriyor. Benim denedigim ortamda 10 degeri (0xa) dOnUsturulen bir karaktere karsilik geldigi icin (0a -> 0d0a) ilk yazdirdigim durumda 5 karakter kullanildi. Yani dosyada toplam 9 karakter olustu.

#include <stdio.h>

void dosyaya_yaz(char const * dosya_adi, char const * mod, int deger)
{
FILE * dosya = fopen(dosya_adi, mod);
fwrite(&deger, sizeof(deger), 1, dosya);
}

int main()
{
dosyaya_yaz("deneme_dosyasi", "w", 10);
dosyaya_yaz("deneme_dosyasi", "ab", 10);

return 0;
}

Ali

acehreli
26/03/2007, 19:48
Bence ikinci sorun ayri bir konu olmaliymis...

Programinin karakterleri gormesinden once kullanilan ara belleklerden senin haberin olamaz. Klavyenin bile ara bellegi var. Calistigin ortamda bu degerleri etkilemek mumkun olabilir ama genellikle su iki kosuldan birisiyle karsilasinca karakterlerin senin programina verildigini dusunebilirsin:

1) Ara bellek dolunca (8 bayt? 128 bayt? kim bilir?)
2) Satir sonuna gelince (Enter tusuna basinca)

Bunlardan da emin olamazsin. Hatta hep hatirlamak gerektigi gibi, programinin girisinde bir klavye de olmayabilir. Girise gelen karakterler baska bir programin cikisindan veya baska bir dosyadan geliyor olabilirler:

baska_program | deneme
deneme < baska_dosya

gibi...

Ali

quasimodo
26/03/2007, 19:58
Kusura bakmayin acmis bulundum bidaha yeni acmiyim
burada devam edicem izninizle ...

Programin girisi ne olursa olsun ister stdin ister baska bizim belirttigimiz dosya
bu degiskenler her zaman bir ara bellege alinirlar peki

Bu ara bellek 8 byte 128 byte kimbilir bilmiyoruz ama kim karar verir biliyormuyuz? (Isletim sistemi diye dusunuyorum ama ...?)

acehreli
26/03/2007, 20:04
Ben emin degilim ama birden fazla ara bellek olabilecegini biliyorum: klavyedeki, isletim sistemindeki, C runtime'daki, giris ag uzerinde bir yerdeyse TCP/IP sistemindeki veya NFS sistemindeki, vs., vs. :)

Ali

acehreli
26/03/2007, 20:06
Haha! O son yazdigim deneme programinda fclose'u unutmusum! :)

Ali

quasimodo
26/03/2007, 20:15
'Text mode'unda acilan C akimlarina yazdirilan karakterler, bulundugun ortama gore bir dOnUsUmden gecirilirler. DOnUsum olmasini istemiyorsan dosyayi 'binary mode'da acman gerekir.

binary acilisla text mode acilis arasindaki farklar nedir bunun disinda?

Bir dosya text modunda acildiginda dosyaya \n karakteri yazilmak istendiginde dosya islevleri otomatik olarak \r ve \n karakterlerini dosyaya yazar. Benzer bicimde dosya gostericisi \r\n karakterini gorurse yanlizca \n okunur... Bu tarz seyler okudum ama....

Unix te bi farki yok galiba...

acehreli
26/03/2007, 20:24
Simdi tekrar arastirdigima gore, 'binary' veya 'text' modda acmak, bazi ortamlarda farkli olabilirmis. Satir sonu karakterinden baska ornege de rastlamadim. Yani sanirim ben cok genel olarak konustugum halde, pratikte butun olay '\n' karakterinin degeri icin gelisiyor.

Unix konusunda hakliymissin; orada 'binary' ve 'text' modunda bir farklilik yokmus...

Ali

quasimodo
26/03/2007, 20:31
Benim de tek bildigim buydu. Baskada yok galiba :)
IST den CA ya cok tessekurler ...