Bu sayfadaki yazılar
Sayfanın metni
Sayfa 35
tıyoruz. Yukarıda verdiğimiz bazı değişiklikleri de yaparak çeşitli dosyalar yaratın ve onları bu programla okumaya çalışın. Ne zaman hata çıktığını, ne zaman beklediğinizden farklı sonuçlar oluştuğunu gözlemleyin. 10. satırda dosyayı açarken eğer o isimde bir SEQ dosyası yoksa, gene kırmızı ışık yanıp sönerek size haber verecektir. Bunu programımızın içine de koyabilirdik. Örneğin;
15 OPEN 2,8,15 16 INPUT # 2,A,A$,B,C 1? CLOSE 2 18 IF A < > 0 THEN CLOSE 1:END
BU PROGRAM YANLIŞ! Halbuki ne kadar doğru duruyor, değil mi? 17. satıra kadar her şey iyi güzel... komut kanalını açıp gelen mesajı okuyoruz. Ama 17. satırda bu kanalı KAPATMAMAMIZ gerekiyordu. Başka dosyalar açıkken bu kanalı açmak onlara bir zarar vermez. Ancak açık olan komut kanalını kapatmanız, aynı zamanda o sırada açık duran diğer tüm dosyaların da kapanmasına yol açacaktır. Dolayısı ile 18. satırda her şey yolunda görünse ve program 20. satırdan devam etse bile, 1 numaralı kanal da 17. satırdaki komut kanalının kapanmasından etkilenerek kapanmış olacağından, INPUT # komutları işe yaramayacaktı. Kıssadan hisse, komut kanalı, eğer kullanılacaksa, programın EN BAŞINDA açılmalı ve EN SONUNDA kapanmalı, arada ellenmemelidir! Şimdi aşağıdaki programlardan biriyle dört satırlık bir sıralı dosya yarattığımızı düşünelim:
10 OPEN 1,8,2,“DEN,S,W” 20 PRİNT 30 PRİNT #1,“SATIR2” 40 PRİNT #1,“SATIR3” 50 PRİNT #1,“SATIR4” 60 CLOSE |
veya
10 OPEN 1,8,2,“DEN,S,W”” 20 PRİNT #1,“SATIRI,SATIR2” 30 PRİNT # 1,“SATIR3,SATIR4” 40 CLOSE 1
Şimdi de bunu okuyacak çeşitli programlar görelim. Bunlar 1541 ile ilgili olmaktan çok, 64-1541 arasındaki bilgi alışverişini sağlayacak programlama tekniklerinin küçük bir gösterisi...
Disket sürücünüz en az bilgisayarınız kadar karmaşık ve mükemmel. O'nu iyi ve verimli kullanmak için çok şey öğrenmeniz gerekli. Ancak bundan sonra 1541'inizi tanıyabilirsiniz.
10 OPEN 1,8,2,'“DEN,S,R” 20 30 INPUT #1,B$ 40 INPUT #1,C$ 50 INPUT #1,D$ 60 PRINT A$ 70 PRİNT B$ 80 PRINT C$ 90 PRİNT D$ 100 CLOSE |
veya
10 OPEN 1,8,2,“DEN,S,R” 20 INPUT # 1,A$,B$,C$,D$ 30 PRİNT A$,B$,C$,D$ 40 CLOSE i
(Bu programın kötülüğü, tek satırda yapılan INPUT #'un tüm değişkenlerinin toplam karakter sayısının 88'i geçmemesi gerektiği. Dolayısı ile, DS'in uzunluğu 88'den büyükse, başımız belada demektir.)
5 DIM A$(4) 10 OPEN 1,8,2,“DEN,S,R” 15 TO4 20 INPUT #1, AS(I) 30 NEXT 1 40 TO4 50 PRİNT 60 NEXT I 70 CLOSE |
veya
10 OPEN 20 INPUT #1,A$ 30 PRINT A$ 40 1F ST< > 64 THEN 20 1
Tüm bunlarda INPUT # kullandık ve bu komutun eksik yanlarını biliyoruz. Bunu düzeltmenin yolunun da GET #'den geçtiğini hatırlıyor olmalısınız. GET # ile kayıtları okurken kayıtlar arasındaki ayırımı biz yapacağımız için hangi tahta perde rolünü oynayacağına karar vermek bizim işimiz. Eğer sadece $0D byte'ını ayırıcı olarak kabul edersek, yukarıda verdiğimiz dört satırlık dosya yaratan iki programın sonuçları farklı olacak demektir. INPUT # ile her ikisinden de dört kayıt okuduğumuz halde, GET # ile birincisi dört, ikincisi ise iki kayıt halinde görünecektir. Şimdi böyle bir okumayı yapan programı görelim:
10 OPEN 1,8,2,“DEN,S,R” IŞ 20 GET #1,N$ 25 IF X$-CHRS(13) THEN 60 30 XS 401FST < > 64 THEN 20 45 PRINT A$ 50 CLOSE 1 55 END 60 PRINT A$ 70 IF ST < > 64 THEN 15 80 CLOSE 1
Görüldüğü gibi dosyayı karakter karakter okuyup kayıtları oluşturuyoruz. Bu arada devamlı ayırıcı byte'ın ve dosya sonunun gelip gelmediğinin de kontrolünü eksik etmiyoruz. Böylece INPUT # için 88 olan karakter sayısı sınırını 255'e çıkarmış oluyoruz. 255'in nedeni, BASIC'te bir değişkenin en fazla 255 karakter alabilmesi. Bunun için elimizden bir şey gelmez. Disketin üzerinde daha önceden yaratılmış bir sıralı dosyanın arkasına yeni kayıtlar eklemek istediğimizde ise A modunu kullanacağımızı söylemiştik. Şimdi DENEME dosyamıza dört satır daha ekleyelim:
10 OPEN 1,8,2,“DENEME,S,A” 20 PRİNT #1,“DONALD” 30 PRİNT & 1, “DUCK” 40 PRİNT S0 PRİNT 60 CLOSE |
10. satırın sonundaki A parametresine dikkat!
Şimdi de bu dosyayı en son verdiğimiz GET # metodu ile okuyun. Tabii dosya adı olarak DEN yerine DENEME kullanılacak. Yeni satırların dosyanın arkasına eklendiğini göreceksiniz. Ama diyelim ki dosyanın ortasına bir kayıt eklemek istediniz. Bunu, ya dosyanın tamamını bilgisayarın hafızasına okuyup istediğiniz sırada geri diskete yazarak (tabii ki, eski dosyayı sildikten sonra!) ya da şimdi vereceğiniz yöntem ile direkt disketin üzerinde halledebilirsiniz. Yöntem, dosyanın kayıt kayıt bir kopyasını çıkarmaya, bu arada da istenen yere önceden hazırlanmış yeni kaydı yerleştirmeye yarıyor. Ancak uzun dosyalarda bu iş de uzun zaman alacaktır. Ayrıca disketin üzerinde, dosyanın eski uzunluğundan yeni kaydedilecek bilginin uzunluğu kadar fazla boş yer olması gerekiyor. Yani disketin yarısını kaplayan bir dosyanız varsa bu işlemi uygulayamazsınız. Gelelim programa...
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 34
1 dosya açık olabilir. İki relative dosya açık olamaz. Dosya adının 16 karakterlik bir isim olacağını biliyorsunuz. Dosya türü yerine de S, U, P, R harflerinden biri gelmeli. Biz sequential dosya kullanacağımız için S harfini koyacağız. Mod ile de, dosyanın ne amaçla açıldığını belirliyoruz. W (write, yazma), R (read, okuma), A (append, ekleme) ile mod belirtilir. Bir de M modu vardır ki, bu mod ile daha önce açılmış ve doğru kapatılmamış, dolayısıyla da diğer modlarda okunamayan dosyaların okunması mümkün olur. Buna daha sonra geleceğiz. Örneğin OPEN 1,8,2, "DENEME,S,W" ile yazmak için DENEME adı altında bir sequential dosya yaratırız. Bu dosyalara yazma işleminin de PRINT ile yapıldığını biliyoruz. Hadi bir örnek yapalım...
10 OPEN 1,8,2,“DENEME,S,W” 20 PRİNT #1,“TUNA” 30 #1,“ERTEMALP” 40 PRİNT #1, “AYHAN” 50 PRİNT 81, “KALAYLIOĞLU” 60 PRİNT #1,“ZİYA” 70 PRİNT $1,“BAYMAN” 80 PRİNT #1,“TURHAN” 90 PRİNT #1, “TANDOĞMUŞ” 100 CLOSE 1
Gördüğünüz gibi, DENEME adı altında bir dosya açtık ve içine sekiz değişik bilgi yazdık. Bunların her birini bir bilgi alanı, isim ve soyadını bir kayıt, DENEME'yi de dosya olarak görebiliriz. Eğer DISKMON kolayda ise, bu dosyanın içeriğine bir göz atın. Her bilgi alanının arasında (örneğin TUNA ile ERTEMALP arasında ve ERTEMALP ile AYHAN arasında) $0D, yani RETURN karakter kodunu göreceksiniz. Eğer 20-90 arası satırların her birinin sonunda noktalı virgül olsaydı bunlar olmayacaktı. Ancak bu 13 değerini taşıyan byte'lar bilgi birimlerini birbirinden ayıran tahta perdelerdir. Onlar olmasaydı, dosyaladığımız bilgileri tekrar okumamız ve özellikle okuduklarımızı tekrar ilk yazıldıkları şekilde parçalara bölmemiz çok zor olurdu. Eğer bu programı çalıştırırken kullandığınız disketin üzerinde türü ne olursa olsun, adı DENEME olan bir başka dosya önceden varsa, kırmızı ışık yanıp sönecek ve PRINT # komutları bir işe yaramayacaktır. Bu durumda ya eski dosyayı silin, ya da DENEME yerine başka bir ad kullanın. Şimdi de bu dosyayı tekrar okuyalım... Okuma işlemi INPUT # ile olacaktır. Ancak INPUT #'un sadece 88 karakterlik bilgileri okuyabildiğini hatırlayalım. Eğer yukarıdaki programda aşağıdaki gibi bir ekleme olsaydı, daha ilk kaydı okumaya kalkıştığımızda hata oluşacaktı!
12 FOR 1-1 TO 100 13 PRİNT 14 15 PRİNT #1
Bu değişiklik ile, aralarında başka byte bulunmayan 100 adet arka arkaya yazıyoruz. Sonra da bu 100 byte'lık bilgiyi TUNA'dan ayırmak için 15. satırda boş bir PRINT#1 gönderiyoruz. Bu, bize istediğimiz $0D byte'ını yaratacaktır. Bir başka sorun da, bizim çok normal olduğunu düşünerek virgül ve iki nokta üstüste gibi karakterleri bir bilgi biriminin içinde kullanmamız olacaktır. Örneğin;
20 PRİNT “İSİM:TUNA, ERTEMALP”
gibi bir satır olsaydı, INPUT # komutu bunu üç defada okuyabilecekti. Önce İSİM ilk bilgi birimi olarak karşımıza çıkacaktı. Sonra da TUNA ve ERTEMALP. Demek ki, “,” ve “:” karakterleri de $0D byte'ı ile aynı işi görüyorlar. Şimdi deminki programımızın ilk halini kabul edip yaratılan dosyayı INPUT okuduğumuza bir bakalım.
10 OPEN 1,8,2,“DENEME,S,R” 20 INPUT #1,A$ 30 PRİNT A$ 40 IF ST < > 64 THEN 20 50 CLOSE | Görüldüğü gibi önce yazma mo- dunda aynı dosyayı bir daha açıyor, sonra da sonuna kadar okuyup satır satır yazıyoruz. 40. satırda ST adlı STATUS değişkenini kontrol edip dosyanın bitip bitmediğini anlayabi- liyoruz. En sonda da dosyayı kapa-