Forum: Projeler d-Ofis RSS
Veri.d
Sayfa:  önceki  1  2  3 
Kadir Can #31
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 3094
dosyadaAra işlevini yazdım.Aslında bu işlev çok kaba.Sadece veri aramanın mantığını anlamak için yazdım.Yani iyileştirilecek.

Asıl problem ise,program derleniyor fakat çalışma zamanında hata veriyor.Bir el atar mısınız?
acehreli (Moderatör) #32
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4511 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Sen de çok kişi gibi çok önemli bir noktayı unutuyorsun: "çalışma zamanında hata veriyor" yeterli değil, çünkü örneğin bende hata vermiyor. Senin nasıl bir hata gördüğünü bilmek çok önemli. :)

    void dosyadaAra(int kolonNo,string veri)
    {
        while(!dosya.eof()){
            for(int i=0;i<3;++i)
            {
                satır=dosya.readln();
            }
            if(satır=="|"){
                --kolonNo;
                if(kolonNo==0){
                    if(satır==veri){
                        writeln(satır);
                    }
                    else{
                        ++kolonNo;
                    }
                }
            }
        }
    }

readln() satır okur; ama sen herhalde sütun okumak istiyorsun.

Dosya işlemleri okuma ve yazma için ayrı dosya imleçleri kullanır. O işleve girildiğinde dosya üzerinde hemen işlem yapmaya başlıyoruz ama herhalde dosyanın başından okumak isteyeceksin. Dosyanın başına gitmek için dosya.rewind()'ı kullanabilirsin.

Öte yandan, dosya'yı başına sarmaya hakkımız var mı? Ve hatta bu işlevden çıkıldığında dosya'yı hangi noktada bırakıyoruz?

Bunun gibi soruları tatmin edici derecede yanıtlamak zordur.

Daha önce belki biraz fazla yumuşak olarak söylemeye çalıştığım gibi, :) veriler dosya üzerinde işlenmezler. Çok çok fazla miktarda verimiz yoksa (yani bir seferde belleğe sığmıyorsa), çoğu program şöyle çalışır:

- program başlayınca verileri dosyadan belleğe oku (örneğin bir eşleme tablosuna)

- program sırasında sürekli olarak bellekte işle (eleman ekle, çıkart, ara, vs. hep eşleme tablosu üzerinde...)

- program sonlanırken veya kullanıcı özellikle 'kaydet' dedikçe bütün verileri baştan sona tekrar dosyaya yaz

Çok ısrarcı bir şekilde bu programın da kesinlikle öyle çalışması gerektiğinin altını çizerim! :) Dosyalar, verilerin kalıcı olabilmeleri için kullanılırlar. (Linux gibi ortamlarda bunun istisnaları da var ama o konumuz dışında.)

Anlaştık değil mi... :) Dosya üzerinde doğrudan veri işlemlerine gerek yok.

Başka bir sorun, dosyanın "a" ile açılıyor olmasında. "a", sonuna eklemek içindir; dosyayı tekrar başına götürüp okumaya yaramıyor. O yüzden dosya.rewind() deyince hata aldım. Okuyabilmek için "a+" yapmalısın.

Bu arada, foreach dosyalarla da kullanılabilir. Senin programında "a+" yaptıktan sonra sırf örnek olarak şunu deneyebilirsin:

    void dosyadaAra(int kolonNo, string veri)
    {
        dosya.rewind();
 
        foreach (satır; dosya.byLine()) {
            writeln("okunan satır: ", satır);
        }
    }

Satırdaki bilgileri ayrıştırmak için de formattedRead kullanılabilir. Biraz tembelce bir işlev yazdım. Amaç yalnızca formattedRead'in nasıl kullanıldığını göstermek. O düzene uymayan satırları da hata atılmasından anlıyorum ve gözardı ediyorum. Tembellik... Normalde baştaki "Kişiler"in filan açıkça okunması iyi olur. Ben ise hata atılacağını biliyorum ve gözardı ediyorum:

    void dosyadaAra(int kolonNo, string veri)
    {
        dosya.rewind();
 
        foreach (satır; dosya.byLine()) {
            writeln("okunan satır: ", satır);
 
            try {
                int id;
                string ad;
                string soyad;
 
                formattedRead(satır, "%s|%s|%s|", &id, &ad, &soyad);
                writefln("   toplanan bilgi: (%s) (%s) (%s)", id, ad, soyad);
 
            } catch (Exception hata) {
                // Okunurken hata olan satırı gözardı ediyorum
            }
        }
    }

Ali
Kadir Can #33
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Dosyalardan tamamen vazgeçtim.Eşleme tablolarına geçiyorum. :D

PES ettim.Dosyalarla bütün ilişiği keseceğim.kaydet gibi bir işlevle hallederiz dosya olayını.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  önceki  1  2  3 
Forum: Projeler d-Ofis RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-10-20, 23:55:37 (UTC -07:00)