14 Eylül 2020 Pazartesi

QuickBasic - 11: Dosya İşlemleri-2

Yayınlama: 2000
Güncelleme: 14 Eylül 2020

Rastgele Erişimli(RANDOM) Dosya

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 sabit diskte oluşturulabilecek maksimum dosya boyutu 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 dosyaya kayıt yapmak veya kayıt okumak 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ıtta 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(bellekte kapladığı bayt) 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 tipini örnek alan bir değişken tanımlayalım.
DIM ogr AS kayit
Sonraki satır random dosya açmak için
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ş(CHR$(32)=" ") 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

PUT#

Sıralı erişimli dosyaya yazmak için PRINT# ya da WRITE# kullanılıyordu.
Rastgele erişimli dosyaya yazmak için PUT# komutu kullanılır.
PUT #dosya numarası, kayıt no, değişken
şeklinde kullanılır.
#dosya numarası: OPEN ile açtığımız dosyanın numarası.
kayıt no belirtilmezse;
Herhangi bir okuma ya da yazma yapılmamışsa, ilk kayıt. Yani 1,
Okuma ya da yazma yapılmışsa; son okuma ya da yazma işleminin kayıt no'sunun 1 fazlasıdır.
Numara belirtilirse o kayıt numarasına yazılır. Numaradan önceki kayıtların daha önceden yazılmış olması şart değildir.
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ı yapacak.
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 &H04 + (256 * &H14) formülü kullanılır.
Sonuç 5124 edecektir.
Yani bizim kaydettiğimiz ogr.no daki sayı.
ogr.adi = Ahmet(41 68 6D 65 74) 5 harf olduğu halde sağına 5 karakter boşluk(&H20 = 32) eklenerek 10 karaktere tamamlanmış.
Çünkü, TYPE tanımlamasında adi as STRING * 10 ile adi değişken uzunluğunun 10 karakter olacağı belirtilmiş. Aynı durum ogr.soyadi değişkeninde de var.

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.
Son işlem ile tanımlanan TYPE e göre bir seferlik kayıtta 22 byte'lık alan kullanılmış olur.
Her yeni kayıt eklemede bu 22'nin katları olarak artar.
Üstteki kodların altına aşağıdaki kodları ekleyin ve çalıştırın.
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.
Ancak 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 0 değerleriyle dolduruldu(22 adet).
Rastgele erişimli denmesinin 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 kayıt no 4 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 sayısı bir bayt olduğu halde, 2 bayt (FF 00) olarak kaydedildi.
Çünkü INTEGER değişken 2 bayt yer kaplar.
&HFF + (256 * &H00) = 255

Aşağıdaki kodlar ile 3. kaydı değiştirelim.
ogr.no = 625
ogr.adi = "Mehmet"
ogr.soyadi = "Ateş"
PUT #1, 3, ogr

Rastgele Erişimli Dosyadan Okuma

GET#

Random dosyadan belirtilen kayıt no'sunu okumak için kullanılır. Okunan bilgiler kayıt yapısına uygun değişkene aktarılır.
GET [#]dosya no[, [kayıt no][,değişken adı]
şeklinde kullanılır.
Kodların devamına aşağıdaki kodları ekleyin.
Dosyayı CLOSE ile kapatmamız ve yeniden açmamız gerekmiyor.
GET #1, 2, ogr
CLS : PRINT "Öğrenci,"
PRINT "NO : "; ogr.no
PRINT "ADI : "; ogr.adi
PRINT "SOYADI : "; ogr.soyadi
İlk önce dosyadan GET# komutuyla 2. 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.
Ş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 dosya boyutunu byte cinsinden alıyoruz, 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:
'Rastgele erişimli dosya(Random)
'kayıt yapısı
TYPE kayit
	no AS INTEGER
	adi AS STRING * 10
	soyadi AS STRING * 10
END TYPE
'kayıt yapısını örnek alan ogr değişkeni
DIM ogr AS kayit

'Rastgele erişimli dosyayı aç
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 değişkeni bilgilerini kaydet

ogr.no = 625
ogr.adi = "Şeref"
ogr.soyadi = "Güneş"
PUT #1, 3, ogr '3. kayıt

ogr.no = 255
ogr.adi = "Mesut"
ogr.soyadi = "Akcan"
PUT #1, 2, ogr '2. kayıt'

ogr.no = 625
ogr.adi = "Mehmet"
ogr.soyadi = "Ateş"
PUT #1, 3, ogr '3. kaydı değiştir

'2. kayıttaki bilgileri ogr değişkenine aktar
GET #1, 2, ogr 
'Bilgileri ekrana yazdır
CLS : PRINT "Öğrenci,"
PRINT "NO : "; ogr.no
PRINT "ADI : "; ogr.adi
PRINT "SOYADI : "; ogr.soyadi
sleep
ku = LOF(1) \ LEN(ogr) 'kayıt uzunluğu
CLS
FOR n = 1 TO ku
	GET #1, n, ogr 'kayıt bilgilerini al
	PRINT n; ". kayıttaki öğrencinin,"
	PRINT "No:", ogr.no
	PRINT "Adı:", ogr.adi
	PRINT "Soyadı: ", ogr.soyadi
	PRINT STRING$(30, "-")
NEXT

CLOSE 'açık dosyaları kapat


Önceki Bölüm: 10: Dosya İşlemleri-1 Sonraki Bölüm: 12: Dosya işlemleri-3

Hiç yorum yok:

Yorum Gönder