DOSYALARLA İLGİLİ ÖRNEKLER Örnek: Herhangi bir sınıfa ait öğrencilerin isimlerini ve numaralarını bir dosyada saklayan programın yazılması. Öncelikle dosyanın içine ilk bilgilerin verilmesi amacıyla Output modunda açılması gerekir. syamızın ismi; ogrenci.txt ve numarası da 4 olsun, dosyamız programın yazıldığı klasörde saklansın dolayısıyla yol ismi vermiyoruz (bunlar bizim belirleyeceğimiz değerler ve ifadeler, ancak başlangıçta keyfi olarak verdiğimiz bu değerleri gerekli olan yerlerde başlangıçta verildiği gibi kullanmamız gerekir). FileOpen satırında dosya numarası 4 olarak verildiği için WriteLine ve FileClose satırlarında da artık 4 olarak kullanılması gerekir, aksi halde bilgisayar hata verecektir. Örnek - Yeni Kayıt Private Sub Yeni_Kayit() Dim n,p,numara as integer, isim as string n = InputBox("Kaç Öğrenci var") FileOpen(4, "c:\ogrenci.txt", OpenMode.Output) For p = 1 To n isim = InputBox(p & ". Öğrencinin ismini verin") numara = InputBox(p & ". Öğrencinin numarasını verin") 'öğrencilerin isim ve numaraları Ogrenci isimli dosyaya yazılıyor WriteLine (4, isim, numara) Next p FileClose (4) 'sya kapatılıyor End İkinci olarak sınıfa yeni öğrencilerin geldiği varsayılırsa, mevcut dosyaya bu öğrencilerin ilave edilmesi ve ogrenci.txt isimli dosyanın Append modunda açılması gerekir. Bu işlem için yukarıdaki programda FileOpen satırındaki Output ifadesinin Append şeklinde değiştirilmesi yeterli olacaktır. Ancak uygulama olması açısından istenirse sya ismi değiştirilmemek kaydıyla İlave Kayıt kısmında dosya numarası değiştirilebilir. Buna gore program aşağıdaki gibi olabilir. Örnek - İlave Kayıt Private Sub ilave_kayit() Dim n,p,numara as integer, isim as string n = InputBox("İlave edilecek Kaç Öğrenci var") FileOpen(7, "c:\ogrenci.txt", OpenMode.Append) For p = 1 To n isim = InputBox(p & ". Öğrencinin ismini verin") numara = InputBox(p & ". Öğrencinin numarasını verin") 'öğrencilerin isim ve numaraları Ogrenci isimli dosyaya ilave ediliyor WriteLine (7, isim, numara) Next p FileClose (7) 'sya kapatılıyor End Gültekin Çağıl, Bilgisayar Programlama ders notları, Sakarya Üniv. Endüstri Mühendisliği/Hafta 14/Sayfa1
Örnek - Kayıtların Listelenmesi Oluşturulan dosyanın istenirse içeriği (tüm kayıtları) ekrana getirilebilir. Bunun için dosyanın okuma (Input) modunda açılması gerekir. Aşağıdaki program daha önce oluşturulan ogrenci.txt isimli dosyanın kayıtlarını ekrana tek tek getirmektedir. Bu programda dikkat edilmesi gereken husus ogrenci.txt isimli dosyada kaç kayıt bulunduğunun bilinmemesidir. Bu durumda FileOpen komutu ile dosya açıldıktan sonra öncelikle her kayıttan önce okunacak kaydın olup olmadığının EOF() komutu ile kontrol ettirilmesidir. Eğer EOF() komutu false yani 'okunacak kayıt var' sonucuna varırsa, bu durumda ilk Input satırı devreye girmekte ve ogrenci.txt isimli dosyanın içinden n. kaydın isim ve numarasını okumaktadır. Daha sonra dosyadan okunan değişken değerleri debug.writeline komutu ile ekrana yazdırılmaktadır. Bundan sonra sıra diğer kayıt için tekrar kayıt sonuna gelinip gelinmediğinin kontrol ettirilmesine gelmektedir. Eğer kayıt sonuna gelindi ise (okunacak başka kayıt yok ise) bu durumda açılan dosya FileClose komutu ile kapatılmakta ve program sona ermektedir. Private Sub Kayitlarin_Listelenmesi() Dim isim As String, numara As Integer FileOpen(12, "c:\ogrenci.txt", OpenMode.Input) Debug.WriteLine("İsim - Numara") If EOF(12) Then Debug.WriteLine("Kayıt Sonu") Exit Input(12, isim) Input(12, numara) Debug.WriteLine(isim & " " & numara) FileClose(12) Örnek Kayıt Düzeltme ogrenci.txt dosyasına girilen bilgiler yanlış girilmiş olabilir. Bu durumda yanlış girilen bilgilerin doğru bilgiler ile değiştirilmesi (düzeltilmesi) gerekir. Bununla ilgili program aşağıda verilmiştir. Program iki parçalıdır, birinci parçasında sözkonusu dosyada kaç adet kayıt bulunduğu bilgisayara buldurulmaktadır. ogrenci.txt isimli dosyanın içinde kaç adet kayıt bulundu bilinmediği için bir önceki örnekte olduğu gibi, kayıt sonuna gelinip gelinmediğini EOF() komutu ile kontrol ettirilerek bütün kayıtlar okutulmakta ve kayıt sayısı n değişkeni ile belirlenmektedir. Programın ikinci parçasında değişik bir durum sözkonusudur. Amaç yanlış girildiği varsayılan kaydın düzeltilmesi olduğu için öncelikle sözkonusu kayda, bu kayda ait bilgilerden birisi ile ulaşmak gerekmektedir. ogrenci.txt isimli dosyanın herbir kaydında öğrenci isimleri ve numaraları vardır. layısıyla bu iki bilgiden herhangibirisi ile yanlış bilgiye ulaşılabilir. Aşağıdaki program yanlış bilgiye ilgili kaydın 'isim bilgisi' ile ulaşmaktadır (istenirse aynı işlemler diğer bilgi olan öğrenci numarası ile de yapılabilir). layısıyla programın öncelikle yanlış girilmiş olan öğrenci ismini sorması (bilmesi) gerekmektedir. Programın işleyiş sırası şu şekildedir: öncelikle FileOpen komutu ile iki adet dosya açılmaktadır. Bunlardan gecici.txt isimli olan Output modunda açılmakta ve ilk defa oluşturulmaktadır. Diğer dosya ise içinde yanlış bilginin bulunduğu ogrenci.txt isimli dosyadır. Bu dosyada Input olarak okuma modunda açılmıştır. Dikkat edilirse aynı anda Gültekin Çağıl, Bilgisayar Programlama ders notları, Sakarya Üniv. Endüstri Mühendisliği/Hafta 14/Sayfa2
iki dosya da açık durumdadır. Bilgisayar yanlış öğrenci ismini öğrendiğine gore; ogrenci.txt isimli dosyadan okuduğu her bilginin yanlış bilgiye eşit olup olmadığını karşılaştırmaktadır. Eğer yanlış bilgiye ulaşılmadı ise ogrenci.txt isimli dosyadan okunan bilgiler herhangibir değişikliğe uğratılmadan olduğu gibi gecici isimli dosyaya yazılmaktadır. Eğer ogrenci.txt isimli dosyadan okunan bilgilerden istenen kayda ulaşıldı ise bu durumda yeni kayıt için doğru bilgiler kullanıcıya sorulmakta ve gecici.txt isimli dosyaya yazılabilmesi için isim = yeni_isim ve numara = yeni_numara işlemi ile gecici.txt isimli dosyaya yazılabilir hale gelmektedir. İşlem sonunda elimizde iki adet dosya bulunmaktadır. Birincisi ogrenci.txt isimli dosyadır ki içinde yanlış bilgi bulunmaktadır, diğeri ise gecici.txt isimli dosyadır ki içinde doğru (düzeltilmiş) bilgiler bulunmaktadır. layısıyla Kill komutu ile ogrenci.txt isimli dosya silinmekte ve içinde doğru bilgilerin bulunduğu gecici.txt isimli dosyanın ismi ogrenci.txt olarak değiştirilmektedir. Private Sub Kayit_Duzeltme() 'ogrenci.txt dosyasında kaç kayıt olduğu bulunuyor Dim isim, deg_isim, yeni_isim As String, numara, yeni_numara, n, u As Integer FileOpen(48, "c:\ogrenci.txt", OpenMode.Input) If EOF(48) Then MsgBox("Ogrenci isimli dosyada " & n & "kayıt vardır") FileClose(48) Exit Input(48, isim) Input(48, numara) n = n + 1 'Kayıt Düzeltme işlemleri yapılıyor deg_isim = InputBox("Kaydı değiştirilecek öğrencinin ismini verin") FileOpen(1, "c:\gecici.txt", OpenMode.Output) FileOpen(2, "c:\ogrenci.txt", OpenMode.Input) For u = 1 To n Input(2, isim) Input(2, numara) If isim = deg_isim Then yeni_isim = InputBox("Yeni ismi verin") yeni_numara = InputBox("Yeni numarayı verin") isim = yeni_isim numara = yeni_numara WriteLine(1, isim, numara) Next u FileClose(1, 2) Kill("c:\ogrenci.txt") Rename("c:\gecici.txt", "c:\ogrenci.txt") MsgBox("Kayıt Düzeltme İşlemi Bitti") Gültekin Çağıl, Bilgisayar Programlama ders notları, Sakarya Üniv. Endüstri Mühendisliği/Hafta 14/Sayfa3
Örnek Kayıt Silme ogrenci.txt dosyasına girilen bilgilerden bazıları silinmek istenebilir. Bu işlem yukarıdaki programın neredeyse aynısıdır. Tek farkı istenen bilgiye ulaşıdığında bu bilginin gecici.txt isimli dosyaya yazılmayıp atlanmasıdır. WriteLine (1, isim, numara) satırının silinmek istenen bilgiye ulaşıldığında, işleme sokulmadığına dikkat edin. İstenilen kaydın silinmesine ilişkin program aşağıdadır. Private Sub Kayit_Silme() 'ogrenci.txt dosyasında kaç kayıt olduğu bulunuyor Dim isim, sil_isim As String, numara, n, u As Integer FileOpen(48, "c:\ogrenci.txt", OpenMode.Input) If EOF(48) Then MsgBox("Ogrenci isimli dosyada " & n & "kayıt vardır") FileClose(48) Exit Input(48, isim) Input(48, numara) n = n + 1 'Kayıt Silme İşlemleri yapılıyor sil_isim = InputBox("Kaydı silinecek öğrencinin ismini verin") FileOpen(1, "c:\gecici.txt", OpenMode.Output) FileOpen(2, "c:\ogrenci.txt", OpenMode.Input) For u = 1 To n Input(2, isim) Input(2, numara) If isim <> sil_isim Then WriteLine(1, isim, numara) Next u FileClose(1, 2) Kill("c:\ogrenci.txt") Rename("c:\gecici.txt", "c:\ogrenci.txt") MsgBox("Kayıt Silme İşlemi Bitti") Gültekin Çağıl, Bilgisayar Programlama ders notları, Sakarya Üniv. Endüstri Mühendisliği/Hafta 14/Sayfa4
Örnek: n adet kişiye ait isim ve telefon numarası bir dosyada tutulmak istenmektedir. sya C nin deneme isimli alt bölgesinde telefon.txt ismi ile oluşturulmuştur. Sözkonusu dosya üzerinde; kayıt, listeleme, düzeltme ve silme işlemleri yapılmıştır. Kayıt seçeneğinde dosya append şeklinde açılmıştır. Append açılış şekli dosya oluşturma durumunda ve ilave kayıt seçeneği için de kullanılabilmektedir, bu iki durumda bu programda kullanılmıştır. Listeleme seçeneği; tüm kayıtların listelenmesi ve her kayda ait isim bilgilerinin soldan bir veya birkaç karakterinin verilerek listelenmesi şeklinde düşünülmüştür. Düzeltme seçeneği, düzeltilecek kayda ait yanlış isim bilgisinin girilerek sözkonusu kayda ulaşılması ve doğru bilgilerin verilip kaydın düzeltilmesi şeklinde düşünülmüştür. Silme seçeneği, istenmeyen, silinmesi düşünülen kaydın hedef dosyaya yazdırılmaması şeklinde düşünülmüştür. Not1: Programın kodlarında birçok açıklama, ilgili satırdan önce yapılmıştır. Not2: Aşağıdaki programda birkaç yerde _ işareti kullanılmıştır. Bu işaret bir program satırını bölmek ve diğer satırdan devam ettirmek için kullanılır. Bu işareti kullanırken bölme işleminin biten işlemi bölmesine dikkat etmelisiniz. Bu durumu aşağıdaki programda tamamı kırmızı işaretlenmiş satırda görebilirsiniz. Bu satır eğer _ işareti ile bölünmemiş olsaydı, inputbox satırının ortasında kaynaştırma (&) işaretinin kullanılmasına gerek olmayacaktı. Not3: Aşağıdaki programda birkaç yerde chr(13) komutu kullanılmıştır. Bu komut, ondalık değerin (örneğin 65 sayısı) karakter karşılığını elde etmek için kullanılır. 65 sayısı, A harfine, 13 sayısı Enter tuşuna karşılık gelir. layısıyla programda kullanıldığı şekliyle chr(13) komutunun geçtiği yerler, sanki orada enter tuşuna basılmış gibi işlem görmesi için kullanılır. Aradaki farkı, chr(13) sayısının geçtiği bir program satırının içinde & Chr(13) & ifadelerini çıkarıp ilgili satırı tekrar çalıştırarak görebilirsiniz. Public Class Form1 Dim q As String Dim w As uble REM q ve w değişkenleri bütün yordamlarda kullanıldığı için REM burada genel olarak tanımlandı REM q dosyadaki isim değişkenine, REM w telefon numarasına karşılık gelmektedir. Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim sec As Byte = InputBox("1-Kayıt" & Chr(13) & _ "2-Kayıtları listeleme" & Chr(13) & _ "3-Kayıt Düzeltme" & Chr(13) & "4-Kayıt Silme" & _ Chr(13) & "5-Çıkış") Select Case sec Case 5 End Case 1 kayit() Case 2 listeleme() Case 3 duzeltme() Case 4 silme() End Select Gültekin Çağıl, Bilgisayar Programlama ders notları, Sakarya Üniv. Endüstri Mühendisliği/Hafta 14/Sayfa5
Sub kayit() REM dosya c'de deneme isimli klasörde oluşturuluyor REM bundan dolayı, sözkonusu yerde deneme isimli REM klasör yoksa öncelikle bu klasörü oluşturun REM kaç kayıt girileceği bilinmiyor REM dolayısıyla her yeni isim girilldiğinde REM kayıta devam edilip edilmeyeceği tekrar soruluyor Dim isim As String, ct As uble FileOpen(3, "c:\deneme\telefon.txt", OpenMode.Append) isim = UCase(Trim(InputBox("Telefon sahibinin ismini & _ verin-çıkış için -9 yazın"))) If isim = "-9" Then Exit ct = InputBox("Telefon numarasını verin") WriteLine(3, isim, ct) Sub listeleme() FileOpen(2, "c:\deneme\telefon.txt", OpenMode.Input) Dim arasec As Byte = InputBox("1-Tamamını listele" & Chr(13) & _ "2-Sadece ismi belli bir harf ile başlayanların listele" & _ Chr(13) & "3-Ana menüye dönüş") REM her iki seçenek içinde aşağıdaki satır gerekli REM olduğundan buraya alındı Debug.WriteLine("İsim --- Telefon No") Dim r As String Select Case arasec Case 1 While Not (EOF(2)) Input(2, q) Input(2, w) REM listelenenler bir sayfadan fazla olamayacağı REM düşünülerek r değişkeninde depolandı ve yordam REM sonucunda msgbox (r) satırı ile ekrana REM listeleniyor, eğer listelenecek bilgiler REM bir sayfadan fazla olursa debug komutu ile REM bunları immediate REM penceresinde yazdırmak daha doğru olacaktır r = r + (q + " --- " + Str(w) + Chr(13)) Case 2 Dim hh As String hh = UCase(Trim(InputBox("İsmi Hangi harf veya " & _ " harfler ile başlayanları listelemek istiyorsunuz"))) Until EOF(2) 'örnek olsun diye until kullanıldı Input(2, q) Input(2, w) REM dosyadan okunan ismin soldan 1. harfden itibaren REM len(hh) kadarı aranan (hh) karakteri/karakterlerine REM eşitmi? eşitse bulunan kaydı ekrana yaz If Mid(q, 1, Len(hh)) = hh Then r = r + (q + " --- " + Str(w) + Chr(13)) Gültekin Çağıl, Bilgisayar Programlama ders notları, Sakarya Üniv. Endüstri Mühendisliği/Hafta 14/Sayfa6
End Select MsgBox(r) ' liste msgbox penceresinde yazdırılıyor Sub duzeltme() Dim dki, yi As String, yn As uble FileOpen(6, "c:\deneme\telefon.txt", OpenMode.Input) FileOpen(23, "c:\deneme\gecici.txt", OpenMode.Output) dki = Trim(UCase(InputBox("Düzeltilecek kayda ait ismi verin"))) While Not (EOF(6)) Input(6, q) Input(6, w) If dki = q Then yi = Trim(UCase(InputBox("ğru ismi verin"))) yn = InputBox("ğru telefon numarasını verin") WriteLine(23, yi, yn) WriteLine(23, q, w) REM içinde düzeltilecek bilgilerin olduğu telefon.txt siliniyor Kill("c:\deneme\telefon.txt") REM içinde doğru bilgilerin olduğu gecici.txt dosyası, REM programda kullanılan telefon.txt dosyası haline getiriliyor Rename("c:\deneme\gecici.txt", "c:\deneme\telefon.txt") Sub silme() Dim dki As String FileOpen(6, "c:\deneme\telefon.txt", OpenMode.Input) FileOpen(23, "c:\deneme\gecici.txt", OpenMode.Output) dki = Trim(UCase(InputBox("Silinecek kayda ait ismi verin"))) While Not (EOF(6)) Input(6, q) Input(6, w) If dki = q Then REM burada silinecek kayıt bulunduğunda kayıt atlattılıyor, REM yani gecici.txt dosyasına birşey yazdırılmıyor, REM aksi halde else kısmında okunan bilgiler gecici.txt REM dosyasına(yazdırılıyor) WriteLine(23, q, w) REM içinde silinecek bilgilerin olduğu telefon.txt siliniyor Kill("c:\deneme\telefon.txt") REM içinde doğru bilgilerin olduğu gecici.txt dosyası, REM programda kullanılan telefon.txt dosyası haline getiriliyor Rename("c:\deneme\gecici.txt", "c:\deneme\telefon.txt") End Class Gültekin Çağıl, Bilgisayar Programlama ders notları, Sakarya Üniv. Endüstri Mühendisliği/Hafta 14/Sayfa7
Örnek (2006 Final imtihan sorusu): C nin sehir klasöründeki bursa.txt ve yine C nin sehir klasöründeki ankara.txt dosyasının yapısı aşağıdaki gibidir. Sözkonusu iki dosyanın her kaydı farklı şehirlere göre; kişinin ismi, yaşı ve doğum yeri şeklinde oluşturulmuştur. Buna göre her iki dosyadaki verileri okuyup, doğum yeri Balıkesir olanların yaş ortalamasını (dikkat, her iki dosyanın yaş ortalamasını) bulup, D nin sonuc klasöründe yort.txt dosyasını oluşturup bu dosyanın içinde sadece Balıkesir ifadesi ile her iki dosyadan elde edilen ortalama değerini bulunduracak programı yazınız (25 puan). bursa.txt dosya içeriği (örnek) Ahmet,24, Balıkesir Ayşe,12, Kayseri Fatma,74, İzmir ankara.txt dosya içeriği (örnek) Sema,32, Samsun Mehmet,45, Balıkesir yort.txt dosya içeriği (örnek) Balıkesir,37 Dim isim1, isim2, il1, il2 As String Dim yas1, yas2, bs, t, ort As uble FileOpen(4, "c:\sehir\bursa.txt", OpenMode.Input) While Not (EOF(4)) Input(4, isim1) Input(4, yas1) Input(4, il1) If il1 = "Balıkesir" Then t = t + yas1 bs = bs + 1 FileOpen(7, "c:\sehir\ankara.txt", OpenMode.Input) While Not (EOF(7)) Input(7, isim2) Input(7, yas2) Input(7, il2) If il2 = "Balıkesir" Then t = t + yas2 bs = bs + 1 ort = t / bs FileOpen(2, "d:\sonuc\yort.txt", OpenMode.Input) Write(2, "Balıkesir", ort) Gültekin Çağıl, Bilgisayar Programlama ders notları, Sakarya Üniv. Endüstri Mühendisliği/Hafta 14/Sayfa8