Kundendatenverwaltung löschen
-
...
-
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.
-
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.