Etiketler

Youtube Kanalıma Abone Olunuz

11 Ekim 2019 Cuma

QuickBasic Kursu: Bölüm 11: Dosya İşlemleri-2

Önceki Bölüm: QuickBasic Kursu: Bölüm 10: Dosya İşlemleri-1
Güncelleme: 11 Ekim 2019
Bu bölümde Random dosya oluşturma, dosyaya yazma ve okumayı öğreneceğiz.

Rastgele Erişimli(RANDOM) Dosya Oluşturma

Belli bir kayıt yapısı olan dosya türleri için uygundur.
Dosyadaki tüm kaydın tamamını okuma yada yazma gibi bir sorunu olmadığından dolayı bellek için de uygundur.
Çok sayıda kayıt işlemi yapılabilir.
Kayıt sınırı, bilgisayarınızın harddisk boş alanı kadardır.
İstenilen kayıt numarası verilerek sadece o kayıt okunabilir veya yazılabilir. Rastgele denmesinin sebebi budur. Baştan sona sıralı bir şekilde tüm kayıtları okumasına gerek yoktur.
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.
ö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(bellekte kapladığı byte) olduğu için genişliğine gerek yoktur.

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)
Rastgele 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ı.

Rastgele 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ığı alanı değiştirmez.
ogr.no = 5124
ogr.adi = "Ahmet"
ogr.soyadi = "Akgül"
PUT #1, , ogr
Sıralı erişimli dosyada YAZMAK için PRINT ya da WRITE kullanılıyordu.
Rastgele 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(1) olarak yazılır.
Okuma ya da yazma yapılmışsa bir sonraki kayda yazılır.
Numara belirtilirse o kayda yazılır.
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, , ogr
Üstteki kodları yazıp çalıştırın.
c:\ornek\ogrenci.txt dosyası oluşacak ve dosya 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 ogr.no daki sayı.

ogr.adi = "Ahmet" 5 harf olduğu halde yanına 5 karakter boşluk eklenerek 10 karaktere tamamlanmış çünkü TYPE tanımlamasında adi as STRING * 10 ile 10 karakter olacağı belirtilmiş.

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.
Ahmet(41 68 6D 65 74) her bir harf ayrı ayrı kaydedilmiş. Devamında ise 5 adet (20) var.
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.
üstteki kodların altına aşağıdaki kodları ekleyin
ogr.no = 625
ogr.adi = "Şeref"
ogr.soyadi = "Güneş"
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. olarak kayıt 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).
Rastgele erişimli demenin nedeni de budur.
Kayıt için bir sıra takip etmek şart değildir.
Rastgele 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.
üstteki kodların altına aşağıdaki kodları ekleyin.
ogr.no = 255
ogr.adi = "Mesut"
ogr.soyadi = "Akcan"
PUT #1, 2, ogr
og.no değeri olan 255 bir bayt olduğu halde, 2 bayt (FF 00) olarak kaydedildi.
Çünkü INTEGER değişken 2 bayt yer kaplar.

Rastgele 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
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, , ogr

ogr.no = 625
ogr.adi = "Mehmet"
ogr.soyadi = "Ateş"
PUT #1, 3, ogr

ogr.no = 255
ogr.adi = "Mesut"
ogr.soyadi = "Akcan"
PUT #1, 2, ogr

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

Sonraki Bölüm:
QuickBasic Kursu: Bölüm 12: Dosya işlemleri-3

Hiç yorum yok:

Yorum Gönder