ELN1002 BİLGİSAYAR PROGRAMLAMA 2 DOSYALAMA Sunu Planı Rasgele Erişim (Random Access) Dosyaları Rasgele Erişim Dosyalarına Veri Yazma Rasgele Erişim Dosyalarından Veri Okuma 1
Sıralı Erişim Dosyası Bir dosya içine kayıtları veya yapıları yerleştirmenin en yaygın yolu, dosyayı Sıralı Erişim Dosyası olarak yapılandırmaktır. Bu yapıda kayıtlar, kayıt anahtarı alanı göz önünde bulundurularak yerleştirilir. Öğrenci bilgileri dosyasında, bilgiler öğrenci numaralarının küçükten büyüğe doğru sıralanacağı şekilde yerleştirilir. En başta en küçük öğrenci numarası, en sonda ise en büyük öğrenci numarası vardır. C normalde, dosyalar için özel bir yapı sağlamaz. Dolayısıyla, dosya yapısı diye bir kavram C dilinin bir parçası değildir. Dosyalama yapısının oluşturulması, tamamen programcıya aittir. Sıralı Erişim Dosya Açma Dosya açma işlemi üç aşamada gerçekleşir. Dosya işaretçisi tanımlanır. fopen() fonksiyonunu kullanarak dosyanın açılması/yaratılması Dosyanın açılıp açılmadığının kontrolü Dosya işlemleri tamamlandıktan sonra dosya fclose ile kapatılır. 2
Rastgele Erişim Dosyaları Sıralı erişim dosyalarında dosya içindeki kayıtlar, dosyanın içine fprintf fonksiyonu ile yerleştirilirler ve aynı uzunlukta olmak zorunda değillerdir. Fakat, rastgele erişim dosyaları için: her bir kayıt normalde aynı uzunluktadır ve diğer kayıtların üzerinden teker teker geçmeyi gerektirmeksizin doğrudan istenen kayda ulaşabileceği şekilde doğrudan(dolayısıyla son derece hızlı) erişilebilirdir. Bu, rastgele erişim dosyalarını, belirli veriye hızlı erişimi gerektiren pek çok uygulama açısından, çok uygun bir araç haline getirir. Rastgele Erişim Dosyaları Rastgele erişim dosyasındaki her bir kayıt eşit uzunlukta olduğu için, bir kaydın dosya başından itibaren nerede bulunabileceği kayıt anahtarının fonksiyonu cinsinden hesaplanabilir. 0 100 200 300 400 500 byte offsetleri 100 byte 100 byte 100 byte 100 byte 100 byte 100 byte 3
Rastgele Erişim Dosyaları Sabit uzunluklu kayıtların varlığı, var olan bir dosyaya, diğer kayıtlara herhangi bir zarar vermeden kayıt yerleştirilebilmesine izin verir. Dosya içindeki herhangi bir kaydın da, aynı şekilde güncellenebilmesine veya değiştirilebilmesine imkan verir. Rastgele Erişim Dosyaları Standart Kütüphane Fonksiyonları fwrite fread fseek rewind ftell fwrite(&ram_adr,sizeof(int),1,fptr); fwrite, bellekte belirli bir adreste bulunan belirli sayıda byte ı dosyanın içine transfer eder. Verinin dosya içinde yazılacağı yeri dosya pozisyon işaretçisi göstermektedir. fread(&ogrenci_data,sizeof(struct ogrenci_data), 1, odptr); Dosya içinde dosya pozisyon işaretçisi ile gösterilen yerdeki belirli sayıda byte ı, bellekte gösterilen adrese transfer eder. int fseek(file *stream, long int offset, int whence); Dosya işaretçisini dosya içerisinde istenilen noktaya getirir. Dosya işaretçisini dosyanın başına taşır. Dosyaya işaretçisinin o an için bulunduğu konumla ilgili bilgiyi döndürür. 4
fwrite fwrite(&ram_adr,sizeof(int),1,fptr); Dosyaya yazılacak verinin bellekteki adresi Dosyaya yazılacak verinin her bir elemanının byte uzunluğu Dosyaya yazılacak eleman sayısı Dosya pozisyon işaretçisi fread fread(&ogrenci_data,sizeof(struct ogrenci_data), 1, fptr); Dosyadan okunacak verinin bellekte yerleştirileceği adres Dosyadan okunacak eleman sayısı Dosyaya yazılacak verinin her bir elemanının byte uzunluğu Dosya pozisyon işaretçisi 5
fseek int fseek(file *stream, long int offset, int whence); Dosya pozisyon işaretçisi Konumlandırma işleminin yapılacağı ofset değeri. Dosya erişim işlemi buradan başlar. Ofset nereden başlar: Dosya başı (SEEK_SET) Dosya sonu (SEEK_END) Geçerli pozisyon (SEEK_CUR) #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 6
7
8
Binary Dosya Açma, Okuma ve Yazma Bir binary dosyanın açılması karakter dosyalarının açılması gibi yapılır, sadece mod farklıdır. Örn : fp = fopen( data.txt, rb ); Bir binary dosyaya rastgele yazma fwrite() fonksiyonu ile yapılır. Bir binary dosyadan rastgele okuma fread() fonksiyonu ile yapılır. 9
Text ve binary dosyalar işletim sistemlerinde bir dosya text ve binary modda açılabilir. Dosyayı binary modda açabilmek için açış modunun sonuna b eklemek gerekir. Örneğin : f = fopen( data, r ) text modda f = fopen( data, rb ) binary modda DOS da bir dosya içerisinde bir karakter aşağı satırın başında görünüyorsa bunu sağlamak için o karakterden önce CR (carriage return) ve LF (line feed) karakterlerinin bulunması gerekir. CR karakteri C de \r ile belirtilir. 13 numaralı ASCII karakteridir. LF karakteri C de \n ile belirtilir. 10 numaralı ASCII karakteridir. Aşağıdaki görüntünün işlem karşılığı a\r\nb şeklindedir. printf fonksiyonunda da a\n yazılmasına rağmen yapılan işlem a\r\nb dir. a b Text ve binary dosyalar Bir dosya text modunda açıldığında dosyaya \n karakteri yazılmak istendiğinde dosya fonksiyonları otomatik olarak \r ve \n karakterlerini dosyaya yazarlar. Benzer bir biçimde dosya text modda açılmışsa dosya göstericisi \r\n çiftini gösteriyorsa dosyadan yalnızca \n karakteri okunur. DOS işletim sisteminde text ve binary dosyalar arasındaki diğer bir fark da, CTRL Z (26 numaralı ASCII karakterinin) dosyayı sonlandırdığının varsayılmasıdır. Oysa dosya binary modda açıldığında böyle bir varsayım yapılmaz. Örneğin: DOS altında bir exe dosyanın binary mod yerine text modda açıldığını düşünelim. Bu dosyada 10 numaralı ve 13 numaralı ASCII karakterleri yanyana bulunduğunda dosyadan okunan değer 1 byte olarak bize yansıyacaktır (\n). Aynı şekilde dosyadan 26 numaralı ASCII karakteri okunduğunda dosyadan artık başka bir okuma yapılamayacaktır. (Dosyanın sonuna gelindiği varsayılacaktır.) 10
11
12
Dosya kopyalama, Silme ve İsim değiştirme Dosyayı başka bir yere kopyalamak için C fonksiyonu mevcut değildir. Dosya kopyala, kopyalanacak dosyanın içeriğinin başka bir dosyaya yazılmasıyla olur. Dosya silme remove() fonksiyonu ile olur. int remove(const char *filename) Dosyanın ismini değiştirmek için rename() fonksiyonu kullanılır. int rename(const char *from, const char *to); 13
Ödev Bir not giriş ve hesaplama programı yazılacaktır. Başlangıç olarak notlar.dat dosyasında sadece isimler yer alacaktır. Kaç öğrenci olduğu belirli değildir. Cengiz Can Ali Murat Ödevler ve vizeler gerçekleştikçe ödev ve vize notları dosyaya kaydedilecektir. Ödev için od, vize için vz, final için fn karakterleri kullanılacaktır: Cengiz Can od 68 od 72 od 55 vz 34 Ali Murat od 54 od 48 od 89 vz 66 Ödev Girişler SON kelimesiyle sonlandırılacaktır Cengiz Can od 68 od 72 od 55 vz 34 od 88 od 64 od 78 fn 64 SON Ali Murat od 54 od 48 od 89 vz 66 od 78 od 82 od 90 fn 72 SON 1. Kullanıcıya her aşamada not girişi mi yapmak istediği, notları listelemek mi istediği yoksa programdan çıkmak mı istediği sorulacaktır. 2. Not girişi yapılırken, girilecek notun ödev mi vize mi final mi olduğu kullanıcıya sorulacaktır. 3. Kaç ödev girileceği, kaç vize olacağı belli değildir. Final girilene kadar herhangi bir sayıda ödev veya vize girilebilir. Final girildikten sonra, her satır sonlandırılacaktır. 4. Girişler tamamlandıktan sonra ödev ortalamasının %15 i, vize ortalamasının %35 i ve finalin %50 si toplanarak dönem içi not oluşturulacak ve bu ortalamalar.dat rastgele erişimli dosyasına yazılacaktır. 14
Ödev Ödev Tarihi: Ödev iki hafta sürelidir, 20.04.2009 24.04.2009 tarihi arası laboratuar çalışmalarında, ödevle ilgili ön çalışmalar yapılacak, 27.04.2009 01.05.2009 tarihi arasındaki laboratuar çalışmalarında tamamlanmış olacaktır. 15