27 Eylül 2020 Pazar

QuickBasic - 10: Dosya İşlemleri-1

Yayınlama: 2000
Güncelleme: 27 Eylül 2020
Bilgileri değişkenlere aktararak bellekte tutabiliyoruz ve onlarla ilgili işlemler yapabiliyoruz.

Belleğe aktarılacak ve işlenilecek bilgiler çok sayıda ve belli bir düzende ve değişme ihtimali olan bilgileri program kodları içine yazmak mantıklı olmayacaktır.

QuickBasic'in kullanabileceği RAM bellek sınırlıdır.
Örneğin 1500 öğrencisi bulunan bir okulda öğrencilerin kayıtlarının tutulacağını düşünün.
Bu bilgiler klavyeden veri girişi ile RAM belleğe aktarılabilse bile bilgisayarı kapattığımızda bilgiler kaybolacaktır.

Bu yüzden kalıcı bellekte kalmasını istediğimiz bilgiler için dosyalar kullanılır.

Üç tür dosya açma ve yönetme yöntemi vardır.
  1. Sıralı erişimli (Sequential)
  2. Rasgele erişimli (Random)
  3. İkili (Binary)

OPEN

Belirtilen aygıt(cihaz)da G/Ç(Giriş/Çıkış = I/O: Input/Output) işlemleri yapmak için kullanılır.
Üzerinde herhangi bir G/Ç işlemi gerçekleştirilmeden önce bir dosya açılmalıdır.
OPEN, dosyaya veya cihaza G/Ç için bir arabellek ayırır ve arabellek ile kullanılan erişim modunu belirler.

OPEN komutunun 2 değişik söz dizimi(syntax) vardır.

1. söz dizimi:
OPEN mod , [#] dosya numarası , dosya [,kayıt genişliği]
Bu söz dizimi eski BASIC sürümleri ile uyum için vardır. O yüzden ayrıntıya gerek yoktur.
Gelişmiş özelliklere sahip olduğu için 2. söz diziminin kullanılması tavsiye edilir.

2. söz dizimi:
OPEN dosya [FOR mod] [ACCESS erişim tipi] [kilit] AS [#]dosya numarası [LEN=kayıt genişliği]
dosya: Cihaz veya "Sürücü:\klasör\dosyaadı.txt" şeklinde açacağınız dosya adresini ve adını tanımlayan metin.
G/Ç için kullanılabilecek cihazlar:
  • KYBD:
    Klavye aygıtı
  • SCRN:
    Ekran aygıtı
  • COMn:
    Seri port. Haberleşme aygıtı(modem)
  • LPTn:
    Paralel port, Yazıcı
  • CONS:
    Konsol aygıtı
Cihaz belirtilmediğinde disk dosyası kullanılır.
mod: Açılan dosyanın ne amaçla kullanılacağı mod ile belirlenir.

Mod Türleri:
  • INPUT: Sıralı erişimli dosyadan veri okumak için
  • OUTPUT: Sıralı erişimli dosyaya veri yazmak için
  • APPEND: Sıralı erişimli dosyanın sonuna veri eklemek için
  • RANDOM: Rastgele erişimli olarak dosyayı açar. Varsayılan moddur.
    Eğer ACCESS ile dosya erişim tipi belirtilmezse dosya şu sıraya göre açılmaya denenir.
    1. Okuma/Yazma (Read/Write)
    2. Yalnız yazma (Write-only)
    3. Yalnız okuma (Read-only)
  • BINARY: GET ve PUT kullanarak dosyadaki herhangi bir bayt konumunda bilgi okunabilir veya yazılabilir.
mod belirtilmezse FOR RANDOM otomatik eklenir.

erişim tipi: Açık dosya için verilen izinler

Dosya erişim tipleri:
  1. READ(okuma),
  2. WRITE(yazma)
  3. READ WRITE (okuma ve yazma) RANDOM ve BINARY dosyalarda kullanılabilir.
kilit: Açık dosyaya ağdaki başka makineler veya programlar veya kodlar işlem yapacaksa dosyadaki kısıtlama ayarı.

Kilitleme türleri:
  1. SHARED: Herhangi bir makinedeki herhangi bir işlem veya program dosyayı okuyabilir veya yazabilir. Kilitli değil.
  2. LOCK READ: Okumaya kilitli
  3. LOCK WRITE: Yazmaya kilitli
  4. LOCK READ WRITE: Yazma ve okuma izni verilmez.
dosya numarası: OPEN ile açılan her dosyaya bir numara(1-255) verilmelidir. Numara, daha önceden açılmış bir dosyanın numarası olmamalıdır.
Kullanılmayan dosya numarası FREEFILE fonksiyonu ile öğrenilebilir.

kayıt genişliği : Rastgele erişimli(Random) dosyalarda kayıt genişliğini(bir kayıttaki karakter sayısı) belirtmek içindir. 32767'den büyük olamaz. Binary dosyalarda kayıt genişliği dikkate alınmaz

Örnek:
'OPEN ile aygıtları kullanma
'©2020 Mesut Akcan
'mesutakcan.blogspot.com
CLS
PRINT "-- Klavyeden oku --"
PRINT "Adınız ?"
dn = FREEFILE
OPEN "KYBD:" FOR INPUT AS #dn
INPUT #dn, a$
CLOSE #dn

PRINT "-- Konsola yazdır --"
OPEN "CONS:" FOR OUTPUT AS #2
PRINT #2, a$
CLOSE #2

PRINT
PRINT "-- Ekrana yazdır --"
OPEN "SCRN:" FOR OUTPUT AS #3
PRINT #3, a$
CLOSE

PRINT "-- LPT1 deki yazıcıya yazdır --"
OPEN "LPT1:" FOR OUTPUT AS #4
PRINT #4, a$
CLOSE

Sıralı Erişimli Dosya Oluşturma ve Dosyaya Yazma

Çoğunlukla az sayıda veya belirli bir kayıt formatı olmayan metin içerikli dosya işlemleri için kullanılır.
Örneğin DOS'daki EDIT programı bu tür dosyaları oluşturur veya açar.
Sıralı erişimli dosya açmak istediğimizde bunu yalnızca OKUMA veya yalnızca YAZMA amaçlı olabilir.
Dosya ne amaçla açılmışsa o amaçla kullanılır.
Okumak için açtığımız dosyaya yazma yapamayız.
Ancak dosya kapatıldıktan sonra yazma amaçlı olarak açıp yazdırabiliriz.
OPEN "c:\ORNEK\veriler.txt" FOR OUTPUT AS #1
Bu satırı açıklayalım.
C: sürücüsü içinde ORNEK klasörü içine dosya.txt adında yeni bir dosya oluşturur.
OUTPUT (YAZMA amaçlı) olarak dosya oluşur, yani okuma amaçlı olarak kullanılamaz.

Eğer C: sürücünüzde ORNEK klasörünüz yoksa Path Not Found (Yol bulunamadı) hatası oluşacaktır.
Dos komut satırına çıkarak MD C:\ORNEK yazarak bu klasörü oluşturup tekrar çalıştırmayı deneyin.
AS #1 ise açtığımız dosyanın dosya numarasının 1 olduğunu belirtiyoruz.
Bu numara dosya yazma ve okuma için kullanılacaktır.
Başka bir dosya açacağımızda, eğer dosya kapatılmadıysa aynı numarayı kullanamayız.
Evet. Bu satırı çalıştırdığımızda klasörümüz varsa içinde dosya.txt oluşacaktır.

Dikkat ! : Eğer dosya daha önceden varsa yeniden oluşacağı için önceki dosyanın var olan içeriği silinecektir

2. satırı ekleyelim.
PRINT #1, "Edep öğrenilmeden ilim öğrenilmez."
PRINT komutunu biliyorsunuz. Ekrana yazı yazmak için kullanılıyordu.
Varsayılan yazma yeri ekran olduğu için yazma yeri yazılmadığında ekrana yazar.
Bu satırda ekrana değilde #1 numara ile açılan dosyaya yazdırılacağını söylüyoruz.
Gördüğünüz gibi burada dosya adını yazmamıza gerek yok, açık olan dosyanın numarası yeterli.

3. ve 4. satırı ekleyelim.
Bu satırlar açık olan dosyaya verileri kaydeder.
PRINT #1, "bir"; "iki"; 4.5, "yedi"; TAB(30); "on"
WRITE #1, "bir", "iki", 4.5, "yedi", "on"
5. satırı ekleyelim.
PRINT "Dosya uzunluğu : " ; LOF(1)
6. satır
CLOSE #1
Bu satırı yazmasak da program çalışır ve hata vermez.
Çünkü program sonlandığında programın açtığı tüm açık dosyalar kapatılır.
Ama siz yine de alışkanlık olarak dosya ile ilgili işlem bittiğinde kapatmayı unutmayın.

Şimdi dosyayı kaydettiğiniz klasöre ulaşın.
Windows'daysanız dosya üzerinde çift tıklayarak,
DOS'da iseniz komut satırına EDIT C:\ORNEK\dosya.txt yazarak ya da TYPE C:\ORNEK\dosya.txt yazarak dosya içeriğini görebilirsiniz.
QuickBasic editörünü kapatmadan komut satırına ulaşmak için menüden File / DOS Shell
Editöre geri dönmek için komut satırında EXIT komutunu girin.
Windows'da dosya içeriğine bakarsanız Türkçe karakterlerin yerine farklı karakterler olduğunu göreceksiniz. Bu normaldir.
Kodların tamamı:
OPEN "c:\ORNEK\dosya.txt" FOR OUTPUT AS #1
PRINT #1, "Edep öğrenilmeden ilim öğrenilmez."
PRINT #1, "bir"; "iki"; 4.5, "yedi"; TAB(30); "on"
WRITE #1, "bir", "iki", 4.5, "yedi", "on"
PRINT "Dosya uzunluğu : "; LOF(1)
CLOSE #1

PRINT#

PRINT komutunun ekrandaki etkisi ne ise aynen o şekilde dosyaya yazar.
PRINT# komutunda veriler arasına virgül, noktalı virgül, TAB, SPC, USING komutları da eklenebilir.

WRITE#

Veriler arasına virgül koyarak dosyaya yazar. String veriler çift tırnak(") ile kaydedilir

LOF

(Long Of File) Dosya numarasıyla belirtilen dosyanın uzunluğunu bayt cinsinden verir.

CLOSE

Numarası belirtilen dosyayı kapatır. Dosya no belirtilmezse tüm dosyalar kapatılır.
Açık olan birden fazla dosyayı kapatmak için;
CLOSE #1, #3, #6
gibi bir komut kullanılabilir.
Kapatılan dosya üzerinde işlem yapılamaz.

Dikkat ! : Dosyalar açıkken elektrik kesintisi veya bilgisayar kilitlenmesi durumunda açık olan dosyalarınıza zarar gelebilir.

Sıralı Erişimli Dosyadan Okuma

Aşağıdaki programı yazıp çalıştırın. Bu kodlar bir dosya oluşturacak
OPEN "c:\ORNEK\veriler.txt" FOR OUTPUT AS #1
WRITE #1, "Mesut", "Akcan", 1970, "Adana"
CLOSE #1
Üstteki programın oluşturduğu dosya üzerinde okuma işlemi yapacağız
OPEN "c:\ORNEK\veriler.txt" FOR INPUT AS #1
Dosyayı okuma amaçlı açacağımızı INPUT ekiyle belirtiyoruz.
Eğer dosya yoksa File Not Found (Dosya bulunamadı) hatası oluşur
INPUT #1, A$, S$, DT%, DY$
INPUT komutunu hatırlarsanız daha önceden klavyeden veri girmek amacıyla kullanılmıştı.
Şimdi ise dosyada kayıtlı olan veriler okunup belirtilen değişkenlere aktarılıyor.
CLS
PRINT A$, S$, DT%, DY$
Değişkenlere aktarılan değerler ekrana yazdırılıyor.
CLOSE
Açık dosya(lar) kapanır.

Kodların tamamı:
OPEN "c:\ORNEK\veriler.txt" FOR INPUT AS #1
INPUT #1, A$, S$, DT%, DY$
CLS
PRINT A$, S$, DT%, DY$
CLOSE

Satır Satır okuma

Daha çok düz metin içerikli dosyaları okumak için kullanılan bir yöntemdir.
Dosya okuma amaçlı olarak açılır.

LINE INPUT#

Kullanımı:
LINE INPUT #dosya numarası , String Değişken adı
Komut yürütüldüğünde dosyadaki ilk satırı komple okuyarak belirtilen değişkene aktarır.
Aşağıdaki örneği inceleyiniz.
CLS : dosya$ = "c:\bootlog.txt"
OPEN dosya$ FOR INPUT AS #1
PRINT dosya$; " dosyası içeriği:"
PRINT "--------------"
DO WHILE NOT EOF(1) 'dosya sonu değilken
 a = a + 1
 IF a > 21 THEN a = 0: SHELL "pause"
 LINE INPUT #1, K$ 'sıradaki satırı oku
 PRINT K$
LOOP

Dosyaya Ekleme Yapma

OPEN "c:\ORNEK\veriler.txt" FOR APPEND AS #1
Daha önceden kayıtlı dosyaya yeni bilgiler eklemek gerekirse dosya APPEND olarak açılır.
OUTPUT olarak açılırsa dosyadaki eski bilgiler silinir.
WRITE # 1 , "Mesut" , "Akcan" , 1970 , "Adana"
CLOSE
Şimdi dosyadaki bilgileri okuyup ekrana yazalım
DEFINT A-Z
NO = FREEFILE 'dosya numarası
CLS
OPEN "c:\ORNEK\veriler.txt" FOR INPUT AS #NO
DO UNTIL EOF(NO) 'dosya sonu değilken
INPUT #NO, A$, S$, DT, DY$
PRINT A$, S$, DT, DY$
LOOP
SEEK #NO, 1
'baştan tekrar okunuyor
PRINT "-------------"
INPUT #NO, A$, S$, DT, DY$
PRINT A$, S$, DT, DY$
CLOSE #NO

FREEFILE

Dosya numarası olarak kullanılmayan bir numara verir.
Özellikle çok sayıda dosya açtığınızda hangi numaraların kullanıldığını bulmak zor olabilir.
Bu durumlarda işe yarar bir komut.

EOF

Dosya sonu demektir(End Of File)
Dosyadaki kayıtların bitip bitmediği bu komutla anlaşılır.

SEEK

Okumaya başlanacak konumu(byte) belirtir.
Başlangıçta 1 dir.
Bu komutu kullanmasaydık okuma konumu dosya sonuna geldiği için Input past end of file (Okuma dosya sonuna taştı) hatası çıkardı.

UYGULAMA

10 personeli olan bir kurumda personel kayıtları bir dosyaya aktarılacak. Bilgiler klavyeden aktarılacak.
Aktarılacak bilgiler: Personelin; adı, soyadı, doğum yeri, doğum yılı, maaşı.
DECLARE SUB cizgi ()
DEFINT A-Z: DEFSTR S: DIM m AS LONG
OPEN "C:\ORNEK\personel.txt" FOR OUTPUT AS #1
FOR n = 1 TO 10
	CLS
	cizgi
	PRINT n; ". personelin bilgilerini giriniz"
	cizgi
	INPUT "Adı:"; sa
	INPUT "Soyadı:"; ss
	INPUT "Doğum yeri:"; sd
	INPUT "Doğum yılı:"; y
	INPUT "Maaşı:"; m
	WRITE #1, sa, ss, sd, y, m
NEXT
CLOSE
cizgi
PRINT "... İşlem tamam ! ..."

SUB cizgi
	PRINT STRING$(40, "-")
END SUB
PROBLEM : Bilgisayarınızdaki C: kök klasöründeki AUTOEXEC.BAT ve CONFIG.SYS dosya içeriğini ekrana yazan program yazınız.

Dikkat : Bu dosyaların yedeğini almadan bunu denemeyin.


Önceki Bölüm: 9: Sayılarla ilgili işlemler Sonraki Bölüm: 11: Dosya İşlemleri-2

Hiç yorum yok:

Yorum Gönder