Yayınlama: 2000
Güncelleme: 14 Eylül 2020
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.
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.
Tanımladığımız kayıt tipini örnek alan bir
değişken tanımlayalım.
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.
İstersek buraya LEN=22 de yazabilirdik.
Çünkü; no 2, adi 10, soyadi 10 bytelık yer kapladığı için toplam 22 olacaktı.
Ş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.
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 TYPEHer 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 |
DIM ogr AS kayitSonraki 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.
Rastgele erişimli dosyaya yazmak için PUT# komutu kullanılır.
#dosya numarası: OPEN ile açtığımız dosyanın numarası.
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.
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.
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ış.
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.
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.
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, ogrOluş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.
Çü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.
Sonra ogr değişkeninin alt değişkenlerini PRINT ile yazdırıyoruz.
Şimdi aşağıdaki kodları ekleyip çalıştırın.
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:
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 CLOSELOF(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