Quick-Basic Kursu
Bölüm 11: Dosya İşlemleri-2
Bu bölümde Random dosya oluşturma, dosyaya yazma ve okumayı öğreneceğiz.
Rasgele Erişimli(RANDOM) Dosya Oluşturma
Belli bir kayıt yapısı olan dosya türleri için uygundur. Dosyadaki tüm kaydı birden okuma yada yazma gibi bir problem olmadığından dolayı bellek için de uygundur. Çok sayıda kayıt işlemi yapılabilir. Sınır, bilgisayarınızın boş harddisk alanı kadardır. İstenilen kayıt numarası verilerek sadece o kayıt okunabilir veya yazılabilir. Böylece hızlı bir şekilde verilere ulaşılabilir.
Random dosyada kayıtlar için bir kayıt yapısı oluşturulmalıdır. Type ….. End Type ile kayıt yapısı belirlenir
TYPE kayit no AS INTEGER adi AS STRING * 10 soyadi AS STRING * 10 END TYPE
Her bir kayıt için kullanılacak değişkenler belirtildi. Gördüğünüz gibi STRING * 10 diye yazarak string değişkenin bellekte kaç karakter kaplayacağını da belirtiyoruz. String harici değişken türlerinin standart genişlikleri olduğu için belirtilmez
Byte cinsinden genişlikler | |
STRING * n | n |
INTEGER | 2 |
LONG | 4 |
SINGLE | 4 |
DOUBLE | 8 |
Tanımladığımız kayıt tipine uygun bir değişken için bellekte yer açalım. Sonraki satır random dosya açmak için
DIM ogr AS kayit OPEN "c:\ornek\ogrenci.txt" FOR RANDOM AS #1 LEN = LEN(ogr)
Rasgele erişimli dosya oluşturmak için RANDOM eki kullanılır. Dosya yoksa yeniden oluşturulur. Varsa herhangi bir problem oluşmaz, dosya silinip yeniden oluşmaz. Açık dosyayı kapatmaya gerek olmadan YAZMA ve OKUMA amaçlı olarak kullanılabilir. Farklı olarak LEN komutu kullanılıyor. Burada her bir kaydın sabit diskte ne kadarlık yer kaplayacağını belirliyoruz. LEN = LEN(ogr) ile ogr değişkeninin bellekte ne kadar yer kapladığını hesaplayıp ona eşitlemesini sağlıyoruz. İstersek buraya LEN=22 de yazabilirdik. Çünkü no 2, adi 10, soyadi 10 bytelık yer kapladığı için toplam 22 olacaktı.
Rasgele Erişimli Dosyaya Yazma
Üstteki kodları yazıp çalıştırdığınızda boş bir dosya oluşur. Şimdi açık olan dosyaya kayıt yapacağız. Önce bellekte açtığımız ogr değişkenini dolduralım. ogr değişkeninin tipi daha önce TYPE komutuyla belirlenmişti. Değişken adı yanına bir nokta koyup tipe uygun değişken adlarından(alt değişken) birini yazıyoruz. ogr.adi gibi. Tüm alt değişkenleri doldurmak şart değildir. Doldurulmazsa; sayılar 0, stringler boş olarak diske yazılır. Doldurulmaması, diskte kapladığı alnı değiştirmez.
ogr.no = 5124 ogr.adi = "Ahmet" ogr.soyadi = "Akgül" PUT #1, 1, ogr
Sıralı erişimli dosyada YAZMAK için PRINT ya da WRITE kullanılıyordu. Rasgele erişimli dosyada ise yazmak için PUT komutu kullanılır.
PUT # dosya numarası , kayıt no , değişken
şeklinde kullanılır. Kayıt numarası belirtilmezse; herhangi bir okuma ya da yazma yapılmamışsa, ilk kayıt olarak yazılır. Okuma ya da yazma yapılmışsa bir sonraki kayda yazılır. Numara belirtilirse o kayda yazılır.
Üstteki kodları yazıp çalıştırın. c:\ornek\ogrenci.txt dosyası oluşacak ve içeriğine ilk kaydı girecek. Bir hex editör ya da viewer ile o dosyaya bakacak olursak
yukarıdaki kodları görürüz.. Sağ bölme kodların ASCII karşılığı, sol bölme ise 16’lı sayı sistemine(HEX) göre her bir byte’ın değeri. İlk 2 karakter(byte) integer değişken için ayrılan alan. Burada 04 ve 14 var. Sayı değerini hesaplamak için 256 * &H14 + &H04 kodlarını kullanabiliriz. Sonuç 5124 edecektir. Yani bizim kaydettiğimiz sayı. Integer değişkenin alabileceği maksimum değer 32767 dir. Öğrenci numarası bu sayıdan daha büyük olma ihtimali varsa; no değişkenini daha büyük sayıları tutabilen LONG olarak tanımlanmalıdır. Sonraki 10 karakter ogr.adi için. Gördüğünüz gibi ad 5 karakterli olduğu halde 10 karakterlik alan ayrılmış. Aynı ogr.soyadi ‘nda olduğu gibi. Böylece, Tanımlanan TYPE e göre bir seferlik kayıtta 22 byte’lık alan harcanmış olur. Her kayıtta bu 22’nin katları olarak artar.
ogr.no = 625 ogr.adi = "Mehmet" ogr.soyadi = "Ateş" PUT #1, 3, ogr
Oluşan dosyayı incelediğimizde üstteki kodları görürüz. Burada farklı olarak PUT komutunu verirken kayıt numarasını da verdik. Ama 2. kaydı yaptığımız halde 3. kayıt alanına kayıt yaptık. Yani 2. kayıt alanını atlamış olduk. Atlamış olduğumuz alanlar da 0 değerleriyle dolduruldu(22 adet).
Rasgele erişimli demenin nedeni de budur. Kayıt için bir sıra takip etmek şart değildir. Rasgele bir numaraya bile kayıt yapılabilir. Bundan sonraki PUT komutunda kayıt numarası belirtilmezse 4 numaralı kayıt olur. Ama biz şimdi bu boş kalan 2. kayıt alanını dolduralım.
ogr.no = 5 ogr.adi = "Selami" ogr.soyadi = "Güneş" PUT #1, 2, ogr
Rasgele Erişimli Dosyadan Okuma
Dosyadan okuma için GET komutu kullanılır. Üstteki kodların devamına aşağıdaki kodları ekleyin. Dosyayı kapatmamız ve yeniden açmamız gerekmiyor.
GET #1, 3, ogr CLS : PRINT "Öğrenci," PRINT "NO : "; ogr.no PRINT "ADI : "; ogr.adi PRINT "SOYADI : "; ogr.soyadi
İlkönce dosyadan GET komutuyla 3. kayıttaki bilgileri bellekte oluşturulan ogr değişkenine aktarıyoruz. Sonra ogr değişkeninin alt değişkenlerini PRINT ile yazdırıyoruz. Kayıt numarasını vermeseydik yine aynı sonucu alırdık. Çünkü bir önceki işlemde 2 numaralı kayda yazdırma yapmıştık. İşlem yapıldıktan sonra bir sonraki kayda atlanacağından 3 numaralı kayıt çağrılır. Şimdi aşağıdaki kodları ekleyip çalıştırın.
ku = LOF(1) \ LEN(ogr): CLS FOR n = 1 TO ku GET #1, n, ogr PRINT n; ". kayıttaki öğrencinin," PRINT "No: "; ogr.no PRINT "Adı: "; ogr.adi PRINT "Soyadı : "; ogr.soyadi PRINT STRING$(30, "-") NEXT CLOSE : END
LOF(1) ile dosyanın boyutunu byte cinsinden alıyoruz, her bir kayıt uzunluğuna bölüyoruz. Kayıt uzunluğu 22 olduğu için LEN(ogr) yerine 22 de yazabilirsiniz. Burada dikkati çeken / değilde \ kullanılması. \ kalansız bölmeler için kullanılır. Normalde kalan olmaması gerekir.
Dosya uzunluğunu kayıt uzunluğuna böldüğümüzde kayıt sayısı çıkar. For döngüsü ile tüm kayıtlar okunur ve ekrana basılır.
Tüm kodlar aşağıda
TYPE kayit no AS INTEGER adi AS STRING * 10 soyadi AS STRING * 10 END TYPE DIM ogr AS kayit OPEN "c:\ornek\ogrenci.txt" FOR RANDOM AS #1 LEN = LEN(ogr) ogr.no = 5124 ogr.adi = "Ahmet" ogr.soyadi = "Akgül" PUT #1, 1, ogr ogr.no = 625 ogr.adi = "Mehmet" ogr.soyadi = "Ateş" PUT #1, 3, ogr ogr.no = 5 ogr.adi = "Selami" ogr.soyadi = "Güneş" PUT #1, 2, ogr GET #1, , ogr CLS : PRINT "Öğrenci," PRINT "NO : "; ogr.no PRINT "ADI : "; ogr.adi PRINT "SOYADI : "; ogr.soyadi ku = LOF(1) \ 22: CLS FOR n = 1 TO ku GET #1, n, ogr PRINT n; ". kayıttaki öğrencinin," PRINT "No: "; ogr.no PRINT "Adı: "; ogr.adi PRINT "Soyadı : "; ogr.soyadi PRINT STRING$(30, "-") NEXT CLOSE : END