Kundendatenverwaltung löschen



  • #include <iostream>
    #include <fstream>
    #include <sstream> 
    #include "customerdb.h"
    
    void CustomerDB::setDBFile(const char *dbfile){//konstruktor statt setter
      if(dbfile==NULL)//assert
        return;
      DBFile=dbfile;
    }
    
    bool CustomerDB::writeToFile(){//void
      std::fstream dbfile;
      dbfile.open(DBFile.c_str(), std::ios::out);//konstruktore benutzen
      if(!dbfile.is_open()){//exception benutzen und durchrauschen lassen
        std::cerr << "Can't open database\n";
        return false;
      }
      if(Customers.empty()){//geht dich gar nix an
        std::cerr << "No Values set for Writing\n";
        return false;
      }
      CustomerPos=Customers.begin();//for
      do{
        if(getId()!=std::string::npos && getFirstname()!=NULL && getLastname()!=NULL){//geht wieder keinen was an
    //die psychohygiene der Namen muss echt woanders passieren
          dbfile << getId() << ";" << getFirstname() << ";" << getLastname() <<"\n";//''
        }
      }while(nextCostumer());//och nö. ++
      dbfile.close();//destruktor
    }
    
    bool CustomerDB::ReadFile(){//nagut, aber bool nur für parserfehler
      if(DBFile.empty()){//geht wieder keinen was an
        std::cerr << "DBPath not Valid\n";//oh, wir schreiben nach cerr. mach dir mal gedanken
        return false;
      }
      std::fstream dbfile;//konstruktor
      dbfile.open(DBFile.c_str(), std::ios::in | std::ios::app);//app für read? 
      if(!dbfile.is_open()){//siehe oben
        std::cerr << "Can't open database\n";
        return false;
      }
      std::string line;//zeig das Werner und er mach Dich einen Kopf kürzer
      while(getline(dbfile,line)){//dito
        size_t splitidpos = line.find(";",0);//dito
        if(splitidpos!=std::string::npos){//und dito bis unten
          std::istringstream idtmp;
          idtmp.str(line.substr(0,splitidpos));
          splitidpos++;
          size_t splitnamepos = line.find(";",splitidpos);
          if(splitnamepos!=std::string::npos){
            Customer customer;
            idtmp >> customer.Id;
            customer.Firstname=line.substr(splitidpos,splitnamepos-splitidpos);
            splitnamepos++;
            customer.Lastname=line.substr(splitnamepos,(line.length()-splitnamepos));
            Customers.push_back(customer);
          }
        }
      }
      dbfile.close();//destruktor
      if(Customers.empty())//geht dich nix an
        return false;
      CustomerPos=Customers.begin();//dafür muss ich dich hauen
      return true;//irrelevant
    }
    
    bool CustomerDB::delCustomer(size_t id){//diese
      if(!ReadFile()){//funktion
        std::cerr << "No entries Found in Database\n";//tut
        return false;//mir
      }//weh
      if(Customers.empty()){
        std::cerr << "No Values set for Removing\n";
        return false;
      }
      CustomerPos=Customers.begin();
      do{
        if(getId()==id){
          Customers.erase(CustomerPos);
        }
      }while(nextCostumer());
      return writeToFile();
    }
    
    bool CustomerDB::addCostumer(){//es reicht. ich weigere mich, das weiter zu lesen
      size_t nextid=std::string::npos;
      if(!ReadFile()){
        std::cerr << "No entries Found in Database\n";
        nextid=0;
      }else{
        nextid=(Customers.rbegin()->Id+1);
      }
      if(Firstname.empty() && Lastname.empty()){
        std::cerr << "First or Lastname not set\n";
        return false;
      }
      Customer customer;
      customer.Id=nextid;
      customer.Firstname=Firstname;
      customer.Lastname=Lastname;
      Customers.push_back(customer);
      return writeToFile();
    }
    
    void CustomerDB::setFirstname(const char *firstname){
      if(firstname==NULL){
        Firstname.clear();
        return;
      }
      Firstname=firstname;
    }
    
    void CustomerDB::setLastname(const char *lastname){
      if(lastname==NULL){
        Lastname.clear();
        return;
      }
      Lastname=lastname;
    }
    
    size_t CustomerDB::getId(){
      return CustomerPos->Id;
    }
    
    const char *CustomerDB::getFirstname(){
      return CustomerPos->Firstname.c_str();
    }
    
    const char *CustomerDB::getLastname(){
      return CustomerPos->Lastname.c_str();
    }
    
    bool CustomerDB::nextCostumer(){
      CustomerPos++;
      if(CustomerPos!=Customers.end()){
        return true;
      }else{
        CustomerPos=Customers.begin();
        return false;
      }
    }
    

    customerdb.h

    #include <string>
    #include <vector>
    
    struct Customer {
      size_t Id;
      std::string Firstname;
      std::string Lastname;
    };
    
    class CustomerDB { 
    public:
      void setDBFile(const char *dbfile);
      bool ReadFile();
      void setFirstname(const char *firstname);
      void setLastname(const char *lastname);
      size_t getId();
      const char *getFirstname();
      const char *getLastname();
      bool delCustomer(size_t id);
      bool addCostumer();
      bool nextCostumer();
    private:
      bool writeToFile();
      std::string DBFile;
      std::string Firstname;
      std::string Lastname;
      std::vector<Customer> Customers;
      std::vector<Customer>::iterator CustomerPos;
    };
    

    customer.cpp

    #include <iostream>
    #include "customer.h"
    
    CustomerInterface::CustomerInterface(const char *dbfile){
      Customerdb = new CustomerDB();
      Customerdb->setDBFile(dbfile);
    }
    
    CustomerInterface::~CustomerInterface(){
      delete Customerdb;
    }
    
    void CustomerInterface::addCustomer(){
      std::string firstname,lastname;
      std::cout << "Enter Firstname: ";
      std::cin >> firstname;
      std::cout << "Enter Lastname: ";
      std::cin >> lastname;
      Customerdb->setFirstname(firstname.c_str());
      Customerdb->setLastname(lastname.c_str());
      Customerdb->addCostumer();
    }
    
    void CustomerInterface::delCostumer(){
      int id;
      std::cout << "Insert ID for removing\n";
      std::cin >> id;
      Customerdb->delCustomer(id);
    }
    
    void CustomerInterface::showCostumers(){
      if(!Customerdb->ReadFile()){
        return;
      }
      do{
        std::cout << "Id: " << Customerdb->getId() << "\n";
        std::cout << "Firstname: " << Customerdb->getFirstname() << "\n";
        std::cout << "Lastname: " << Customerdb->getLastname() << "\n";
        std::cout << "__________________\n";
      }while(Customerdb->nextCostumer());
    }
    

    customer.h

    #include "customerdb.h"
    
    class CustomerInterface {
    public:
      CustomerInterface(const char *dbfile);
      ~CustomerInterface();
      void addCustomer();
      void delCostumer();
      void showCostumers();
    private:
      CustomerDB *Customerdb;
    };
    

    main.cpp

    #include <iostream>
    #include "customer.h"
    
    int main(){
      char input;
      std::cin >> input;
      CustomerInterface *CstIntf = new CustomerInterface("/tmp/cstdb.csv");
      switch(input){
        case 'a':
          CstIntf->addCustomer();
          break;
        case 'r':
          CstIntf->delCostumer();
          break;
        case 's':
          CstIntf->showCostumers();
          break;
      }
      delete CstIntf;
      return 0;
    }
    


  • Warum sollte ich während die ganz Zeit während ich die Klasse die benutze die Datei geöffnet lassen ? Lasse ich die Tür ganzen Tag auf nur weil zweimal am Tag
    rein und raus gehe ?

    Die for schleife wäre eleganter gewesen und std::ios::app darf dort nicht rein zu meiner Entschuldigung war schon spät.

    Die exeption hätte man durch aus verwenden können aber nen Rückgabe für Schreibfunktion halt ich durch aus für Sinnvoll es könnte gut sein spätere Prozesse brauchen und den nächsten schritt auszuführen.

    std::string line = ""; wenn glücklich macht aber sie ist eh nur nur local und wird von getline befüllt.

    Das ReadFile den iterator zurückgesetzt halt ich durchaus für Sinvoll nen Buch fange ich auch nicht in der mitte an zulesen.



  • Tuxi schrieb:

    Warum sollte ich während die ganz Zeit während ich die Klasse die benutze die Datei geöffnet lassen ?

    Du plenkst.
    Habe nie vorgeschlagen, die Datei offen zzu lassen.

    Tuxi schrieb:

    Lasse ich die Tür ganzen Tag auf nur weil zweimal am Tag rein und raus gehe ?

    Du plenkst.
    Ich lasse meine Türen auf.

    Tuxi schrieb:

    Die for schleife wäre eleganter gewesen

    Welches for? Man erkennt EOF erst, wenn man es gelesen hat.

    Tuxi schrieb:

    und std::ios::app darf dort nicht rein zu meiner Entschuldigung war schon spät.

    Jo, aber das ist der unwichtigste Punkt.

    Tuxi schrieb:

    Die exeption hätte man durch aus verwenden können aber nen Rückgabe für Schreibfunktion halt ich durch aus für Sinnvoll es könnte gut sein spätere Prozesse brauchen und den nächsten schritt auszuführen.

    Du blähst Deinen Code aufs Doppelte auf mit der nutzlosten Fehlerbehandlung überall. Benutze doch einfach C++, statt deinen armen Compiler und noch ärmeren Moderator mit C zu quälen.

    Tuxi schrieb:

    std::string line = ""; wenn glücklich macht aber sie ist eh nur nur local und wird von getline befüllt.

    Hä? Nö! std::string line = ""; frißt nur Ressourcen und ist viel schlechter lesbar als std::string line;
    Dir fragliche Frage ist, ob man überhaupt die Zeilen erst in Strings tuten tun muss, um sie dann nochmal zu lesen.
    Und ausgerechnet Formatfehler gibst Du nicht hoch, sondern nur den unwichtigen Kram. Hast Du nen Kumpel, der für Dich das Debugging übernimmt?

    Tuxi schrieb:

    Das ReadFile den iterator zurückgesetzt halt ich durchaus für Sinvoll nen Buch fange ich auch nicht in der mitte an zulesen.

    Aber der Iterator selber ist keine gute Idee. Buch?

    Die Ärger/Code-Dichte verbessert sich nicht nach unten hin. Ah, Buch. Du musst dringend Bücher lesen, die von nach 1985 sind und vor allem von guten Autoren sind. Außerdem meide den Wolf. Und Bücher, die extrem schnellen Erfolg versprechen. Kannst als Schnelltest nehmen, ob sie im Code new/delete so sinnlos verwenden wie Du. Wenn ja, lies sie nicht. Wenn sie es ein wenig öfter verwenden, lies sie nicht. Wenn sie es ein wenig seltener verwenden, lies sie nicht. Findest Du ein .close(), lies sie erst recht nicht.


Anmelden zum Antworten