folder Tahribat.com Forumları
linefolder C - C++
linefolder [C]Kayıt Dosyasından Veri Silme



[C]Kayıt Dosyasından Veri Silme

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    Cnin kütüphanelerinde direk kayıt silmeye yarayan bi fonksiyon bulamadım...struct olarak bilgiler kaydedilmiş,her struct numaralandırılmış ve numaraya göre struct silinmiş.Bunu bide şu şekilde yazmışlar;


    void KitapKayitSil()//kayıt silme
    {     
       char geciciISBN_NO[20];
       cout<<"Silinecek olan kitabin ISBN numarasini giriniz : ";
       cin>>geciciISBN_NO;
       fstream file("Kitap.txt" , ios::in||ios::binary);
       while(!file.eof())
       {
           file.read(reinterpret_cast<char*>(&kayit),sizeof(kayit));
           if(kayit.isbn!=geciciISBN_NO)
           {
             fstream file1("Kitap1.txt" , ios::app||ios::out||ios::binary);
             file1.write(reinterpret_cast<char*>(&kayit),sizeof(kayit));
           }
       }
        cout<<"Kayidiniz basariyla silinmistir.";
    
        file.close();
    
        remove("Kitap.txt");
        rename("Kitap.txt","Kitap1.txt");
    }

     

    bu kodda struct kullanılmamış ama bunuda ben anlayamadım. Bu kodlarda ne yapılmış tam olarak?


    :)
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    JPriest
    JPriest's avatar
    Kayıt Tarihi: 09/Mart/2007
    Erkek

    wasd bunu yazdı:
    -----------------------------

    bu kodda struct kullanılmamış ama bunuda ben anlayamadım. Bu kodlarda ne yapılmış tam olarak?


    -----------------------------

    kayit diye global bi değişken olması lazım yukarlarda bi yerde, Struct olması lazım onun da. Yani struct kullanılmamış dersek yanlış konuşmuş olabiliriz.


    Sen hiç kaval çaldın mı?
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tugberk
    Tugberk's avatar
    Kayıt Tarihi: 04/Ekim/2009
    Erkek

    Çok kötü bir algoritma ve büyük dosyalarda çok kullanışsız. Ancak olayın yapıya okuma, satır okuma vs ile ilgisi yok, kayıtları satır satır yazdıysan satır satır okuyup kontrol edersin, yapı şeklinde yazdıysan yapı boyutu kadar okuyarak kontrol edersin.

    Yukarıdaki algoritma şunu yapıyor, kitap.txt dosyasından satır satır(daha doğrusu yapı yapı) tüm kayıtları okuyor ve kitap1.txt dosyasına yazıyor, sadece silinmek istenen kayıta geldiğinde bunu kitap1.txt e yazmıyor, böylece kitap1.txt de ilgili kayıt hariç tüm kayıtlar var oluyor. işlem bitince kitap.txt siliniyor ve kitap1.txt in ismi kitap.txt olarak değiştiriliyor.

  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    @JPriest     doğru onu gözden kaçırmışım,konuyu açarken dersteydimde.

    @Tuğberk  büyük boyutlu kayıtlarda sıkıntı yaratır doğru ben bunu düşünmemiştim...daha önceki konuda senin yazdığın kodları düzenledim,değişkenleri bi yapıda toplayıp yapılacaklarıda fonksiyon haline getirdim.Kayıt silmek için ne yapacağımı bulamadım,silmeyi yapsam önce arama,sonra silme sonrada yeni kayıt fonksiyonlarını çalıştırıp düzenleme kısmınıda halledicem.

    reinterpret_cast<char*>

    şu komutun ne işe yaradığını araştırdım ama tam bişey anlayamadım google sonuçlarından :/


    :)
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tugberk
    Tugberk's avatar
    Kayıt Tarihi: 04/Ekim/2009
    Erkek

    wasd bunu yazdı:
    -----------------------------

    @Tuğberk  büyük boyutlu kayıtlarda sıkıntı yaratır doğru ben bunu düşünmemiştim...daha önceki konuda senin yazdığın kodları düzenledim,değişkenleri bi yapıda toplayıp yapılacaklarıda fonksiyon haline getirdim.Kayıt silmek için ne yapacağımı bulamadım,silmeyi yapsam önce arama,sonra silme sonrada yeni kayıt fonksiyonlarını çalıştırıp düzenleme kısmınıda halledicem.

    reinterpret_cast<char*>

    şu komutun ne işe yaradığını araştırdım ama tam bişey anlayamadım google sonuçlarından :/


    -----------------------------

     

    Zaten büyük projelerde sql kullanılır, senin yaptığın proje küçük çaplı bir deneme projesi olacak büyük ihtimalle, dolayısıyla bu yöntemi kullanabilirsin, zaten C ile böyle db projeleri yazılmasını doğru bulmuyorum, her dilin belirli bir hedefi vardır, ancak ülkemizde C dersi de verilse , Visual Basic dersi de verilse örnekler standarttır, öğrenci takip programı vb.

    sql kullanmadan şu şekilde çok iyi performanslı bir arama tasarlayabilirsin, ISBN numarasını girdi olarak alıp, kitap index numarasını key olarak veren bir hash fonksiyonu tanımlayabilirsin. Örneğin 1 milyon kitap için bir db olduğunu varsayalım, oluşturduğun hash fonksiyonu, isbn numarasını alıp 0-1000000 arasında bir benzersiz index değeri üretmelidir, bu değer kullanılarak, kitap listesindeki kitap tek hamlede seçilebilir, hiç bir arama karşılaştırma işlemine gereksinim kalmaz.

    diyelim ki girdi şu, 9757092126,  bu girdiyi hash fonksiyonuna verdiğimizde çıktı 198541 değeri verdi, doğrudan o index li kitaba ulaşılır, (yapı dizisi vb yöntem ile kitapların bellekte bulunduğunu varsayıyorum) istersen o kitabı ve bilgilerini lsitelersin, istersen başındaki bir baytı değiştirerek ya da komple yapı boyutu kadar silerek o kaydı yok etmiş olursun.

    Tabiki aynı hash ı üreten birden fazla girdi olabilmektedir, zaten hash fonksiyonlarının en büyük sıkıntısı budur ancak bağlı listeler gibi bir takım yöntemler ile çözülebilmektedir.

    reinterpret_cast<char*>' a gelince, o yapı C++ da (char*) a benzemekte, yani herhangi bir veri yapısını bir dizi ya da değişkene birebir dönüştürmeye yarar. örneğin 16 baytlık bir struct'ı 16 baytlık bir char dizisine birebir çevirirsin, bit bit aktarılır.

Toplam Hit: 2820 Toplam Mesaj: 5