Quick-Basic Kursu
Bölüm 10: Dosya İşlemleri-1
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. Qbasic’in kullanacağı bellek de sınırlıdır. Örneğin beş bin öğrencisi bulunan bir okulda öğrencilerin kayıtlarının tutulacağını düşünün. Bu bilgiler klavyeden 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ürlü dosya açma yöntemi vardır. Sıralı, Rasgele erişimli ve Binary
OPEN
Disk üzerinde dosya oluşturmak ve değişiklik yapmak için OPEN komutu kullanılır.
1 |
<strong>OPEN</strong> dosyaadı [<strong>FOR</strong> açma tipi] [<strong>ACCESS</strong> erişim tipi] [lock] <strong>AS</strong> [#]dosyanumarası [<strong>LEN</strong>=kayıt genişliği] |
dosyaadı : “Sürücü : \ klasör\ dosyaadı” şeklinde açacağınız dosyayı tanımlayan metin
açma tipi : INPUT, OUTPUT, APPEND, RANDOM ya da BINARY tiplerinden biri
erişim tipi : Ağ ortamında dosyayı başkaları da açacaksa dosyaya erişim tipini belirleyebilirsiniz. READ(okuma), WRITE(yazma) veya READ WRITE (okuma ve yazma, RANDOM ve BINARY dosyalarda geçerlidir)
lock : dosya kilitleme
dosya numarası : açılan her dosyaya bir numara verilmelidir.
kayıt genişliği : Rasgele erişimli dosyalarda kayıt genişliğini belirtmek içindir.
Sıralı Erişimli Dosya Oluşturma ve 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 DOSdaki 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.
1 |
OPEN "c:\ORNEK\dosya.txt" FOR <font color="#ff0000">OUTPUT</font> 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şur. 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 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 varolan içeriği silinecektir
2. satırı ekleyelim
1 |
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ı filan yazmamıza gerek yok, açık olan dosyanın numarası yeterli.
Şimdi kaydettiğiniz klasöre ulaşın. Windowsdaysanız dosya üzerinde çift tıklayarak, DOS da iseniz
EDIT C:\ORNEK\dosya.txt
yazarak dosya içeriğini görebilirsiniz. Windowsda dosya içeriğine bakarsanız Türkçe karakterlerin yerine farklı karakterler olduğunu göreceksiniz. Bu normaldir.
3. satırı ekleyelim.
1 |
PRINT "Dosya uzunluğu : " ; <font color="#ff0000">LOF(1)</font> |
LOF : Dosya numarasıyla belirtilen dosyanın uzunluğunu byte cinsinden verir
4. ve 5. satırı ekleyelim.
1 2 |
PRINT #1, "bir" , "iki" ;"yedi" ; TAB(30) ; "on" <font color="#ff0000">WRITE</font> #1, "bir" , "iki" , "yedi", "on" |
WRITE komutu; verileri, arasına virgül koyarak dosyaya(yazma amaçlı açılan) yazar. PRINT komutunun ekrandaki etkisi ne ise aynen o şekilde dosyaya yazar. PRINT #de veriler arasına virgül , noktalı virgül , TAB SPC USING komutları da eklenebilir.
6. satır
1 |
CLOSE #1 |
Numarası belirtilen dosyayı kapatır. 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 kapatma komutunu yazmayı unutmayın. Numara 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 kilitlenme 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
1 2 3 |
OPEN "c:\ORNEK\veriler.txt" FOR OUTPUT AS #1 WRITE #1, "Mesut", "Akcan", 1968, "Adana" CLOSE #1 |
Üstteki programın oluşturduğu dosya üzerinde okuma işlemi yapacağız
1 |
OPEN "c:\ORNEK\veriler.txt" FOR <font color="#ff0000">INPUT</font> 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
1 |
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.
1 |
CLS : PRINT A$, S$, DT%, DY$ |
Değişkenlere aktarılan değerler ekrana yazdırılıyor.
1 |
CLOSE |
Dosya(lar) kapanıyor.
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.
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.
1 2 3 4 5 6 7 8 9 10 |
CLS : dosya$ = "c:\bootlog.txt" OPEN dosya$ FOR <font color="#ff0000">INPUT</font> AS #1 PRINT dosya$; " dosyası içeriği:" PRINT "--------------" DO WHILE NOT EOF(1) a = a + 1 IF a > 21 THEN a = 0: SHELL "pause" <font color="#ff0000"> LINE INPUT </font>#1, K$ PRINT K$ LOOP |
Dosyaya Ekleme Yapma
1 |
OPEN "c:\ORNEK\veriler.txt" FOR <font color="#ff0000">APPEND</font> AS #1 |
Daha önceden kayıtlı dosyaya yeni bilgiler eklemek gerekirse APPEND kullanılır. OUTPUT kullanılırsa eski bilgiler silinir.
1 2 |
WRITE # 1 , "Ahmet" , "Akgül" , 1972 , "Ankara" CLOSE |
Şimdi dosyadaki bilgileri okuyup ekrana yazalım
1 2 3 4 5 6 7 8 9 10 11 12 13 |
DEFINT A-Z NO = <font color="#ff0000">FREEFILE</font>: CLS OPEN "c:\ORNEK\veriler.txt" FOR INPUT AS #NO DO UNTIL <font color="#ff0000">EOF</font>(NO) INPUT #NO, A$, S$, DT, DY$ PRINT A$, S$, DT, DY$ LOOP <font color="#ff0000">SEEK</font> #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
5 Personeli olan bir kurumda personel kayıtları bir dosyaya aktarılacak. Aktarılacak bilgiler: Personelin; adı, soyadı, doğum yeri, yaşı, maaşı. Bilgiler klavyeden aktarılacak
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
DEFINT A-Z: DEFSTR P: DIM m AS LONG OPEN "c:\ornek\personel.txt" FOR OUTPUT AS #1 FOR n = 1 TO 10 CLS : PRINT STRING$(40, "-") PRINT n; ". personelin bilgilerini giriniz" PRINT STRING$(40, "-") INPUT "Adı"; pa INPUT "Soyadı"; ps INPUT "Doğum yeri"; pd INPUT "Yaşı"; y INPUT "Maaşı"; m WRITE #1, pa, ps, pd, y, m NEXT CLOSE PRINT STRING$(40, "-") PRINT "... işlem tamam ..." |
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.