Kundendatenverwaltung löschen



  • Also meine frage ist da er ja nachdem man es gespeichert hat eine datei erstellt in der die kundendaten stehen will ich nun das man bei der auswahl des löschens er alle inhalte der Datei löscht.



  • Elraser1993 schrieb:

    Also meine frage ist da er ja nachdem man es gespeichert hat eine datei erstellt in der die kundendaten stehen will ich nun das man bei der auswahl des löschens er alle inhalte der Datei löscht.

    Tut mir Leid, ich verstehe deinen Satz nicht.

    Ich rate dir ausserdem zu einem C++-Buch für Anfänger (nicht böse gemeint) nachdem ich den Code von oben überflogen habe.

    Ich merke übrigens Ähnlichkeiten zwischen diesem Thread und dem anderen Thread von dir, kann mir also auch durchaus vorstellen, dass dieser Thread gleich endet wie der andere.

    Tue dir doch selbst einen gefallen und versuche selbst die Lösung zu finden. Wenn du dabei Probleme hast, kannst du konkrete und spezifische Fragen stellen, die auch viel einfacher und besser beantwortet werden können. Was soll es deinem Lernprozess denn bringen wenn nun jemand deinen Code schnell erweitert und du es sowieso nicht verstehst?



  • wieso versteht das den keiner ^^ ich will nicht das einer meinen code erweitert ich will vllt ne info zu einer funktion oder sowas in der art



  • Elraser1993 schrieb:

    wieso versteht das den keiner ^^ ich will nicht das einer meinen code erweitert ich will vllt ne info zu einer funktion oder sowas in der art

    Ok - diesen Satz:

    Elraser1993 schrieb:

    Also meine frage ist da er ja nachdem man es gespeichert hat eine datei erstellt in der die kundendaten stehen will ich nun das man bei der auswahl des löschens er alle inhalte der Datei löscht.

    verstehe ich auch nicht.

    Wenn Du einen Datensatz aus

    TKunde KundenFeld [100];
    

    löschen möchtest, so musst Du ihn zunächst finden - das kann man z.B. mit std::find_if machen und anschließend löschen. Das wäre einfach wenn Du einen std::vector benutzen würdest - der kennt erase.

    Sag' uns doch bitte zunächst einfach, ob es ok für Dich ist, alles aus dem C++-Standard zu nutzen.

    Gruß
    Werner



  • ...


  • Mod

    Swordfish schrieb:

    std::ofstream::ofstream. Öffne die Datei im Modus ios::trunc und schließe sie wieder.

    Und da out alleine das gleiche macht wie out und trunc zusammen und out sowieso schon der Vorgabemodus ist, reicht sogar ein einfaches Öffnen und Schließen ganz ohne weitere Parameter aus.



  • ...


  • Mod

    Swordfish schrieb:

    😮

    Und remove gibt es auch noch in der cstdio 🙂



  • ...



  • Elraser, kennst du schon den Standard std::deutsch?



  • Ja, kennt er, er nutzt die Chat-Edition.
    dort schreibt man alles klein und ohne satzzeichen.
    Diese ist sehr gut für eingebettete Systeme und mobile Geräte geeignet.



  • Der Übersicht halber würde ich erst mal in Funktionen splitten.

    Ein Struct innerhalb einer Funktion deklarieren unschön.

    Zu dem scheint mir der Code im copy und paste Endstanden zu sein würde zumindest
    die Mischung aus C/C++ Code erklären.

    Man kann gutes Gewissens C Funktionen nutzen nur die sollten Sinnvoll dosiert werden.

    TKunde könnte zum Beispiel sinnvoller weise in einem Vector untergebracht werden.

    system()
    

    sollte nur im Notfall genutzt werden und ist immer unschön.

    10 x std::endl untereinander ? vermutlich wäre ein '\n' sinnvoller in dem Fall.

    char cstring[] nur zum spass drinne ?

    using namespace std; würde ich mir gar nicht erst angewönnen kann bei späteren Projekten sehr problematisch werden.

    Das schöne an structs ist man kann sie direkt in eine Datei schreiben das so neben her.



  • Welche C-Funktionen sollte man denn nutzen?
    Mir fällt da spontan nur die aus cmath ein, aber die sind ja in C++ alle überladen, also nur halb C.


  • Mod

    Nathan schrieb:

    Welche C-Funktionen sollte man denn nutzen?

    In cstdlib sind so einige Schätzchen die bloß kaum jemand kennt. Und besonders vor C++11 gab es oftmals gar keine Alternative (z.B. Datum und Zeit), wenn man die Standardbibliothek benutzen wollte.



  • oder zum beispiel Low Level funktionen des Betriebsystemes



  • customerdb.cpp

    #include <iostream>
    #include <fstream>
    #include <sstream> 
    #include "customerdb.h"
    
    void CustomerDB::setDBFile(const char *dbfile){
      if(dbfile==NULL)
        return;
      DBFile=dbfile;
    }
    
    bool CustomerDB::writeToFile(){
      std::fstream dbfile;
      dbfile.open(DBFile.c_str(), std::ios::out);
      if(!dbfile.is_open()){
        std::cerr << "Can't open database\n";
        return false;
      }
      if(Customers.empty()){
        std::cerr << "No Values set for Writing\n";
        return false;
      }
      CustomerPos=Customers.begin();
      do{
        if(getId()!=std::string::npos && getFirstname()!=NULL && getLastname()!=NULL){
          dbfile << getId() << ";" << getFirstname() << ";" << getLastname() <<"\n";
        }
      }while(nextCostumer());
      dbfile.close();
    }
    
    bool CustomerDB::ReadFile(){
      if(DBFile.empty()){
        std::cerr << "DBPath not Valid\n";
        return false;
      }
      std::fstream dbfile;
      dbfile.open(DBFile.c_str(), std::ios::in | std::ios::app);
      if(!dbfile.is_open()){
        std::cerr << "Can't open database\n";
        return false;
      }
      std::string line;
      while(getline(dbfile,line)){
        size_t splitidpos = line.find(";",0);
        if(splitidpos!=std::string::npos){
          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();
      if(Customers.empty())
        return false;
      CustomerPos=Customers.begin();
      return true;
    }
    
    bool CustomerDB::delCustomer(size_t id){
      if(!ReadFile()){
        std::cerr << "No entries Found in Database\n";
        return false;
      }
      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(){
      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;
    }
    

    Irgendwie ist meine Laune heute gut 😃



  • ...



  • #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