Kundendatenverwaltung löschen
-
Moin,
ich bin grad dabei ein Kundenverwaqltungsprogramm zu schreiben nur als übung habe schon ein paar sachen reingebracht bin grad an einer stelle die gespeicherten kundendaten zu löschen und weis keinen ansatz.Wenn jemand etwas weis freue mich über jede hilfe ^^^
#include <cstdlib> #include <iostream> #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <sstream> #include <fstream> #include <string> using namespace std; int main(int argc, char *argv[]) { struct TKunde { int nr; string vorname ; string nachname ; }; TKunde KundenFeld [100]; char Eingabe; char cstring[256]; string Value; int DatNr = 0; int i,s; bool Abbruch = false; fstream fKunde; char *token; //void speichern //Fpinput = fopen("kunden.txt"); for (s=0; s<100; s++) { KundenFeld[s].nr=s; KundenFeld[s].vorname=""; KundenFeld[s].nachname=""; } while (Abbruch == false) { cout<<"********** Kundendatenverwaltung ***************" << endl; cout<<" [n] neuen Kunden anlegen " << endl; cout<<" [a] Alle Kunden Anzeigen " << endl; cout<<" [s] Alle Kundendaten speichern " << endl; cout<<" [d] Kundendaten löschen " << endl; cout<<" [e] Kundendaten einzeln anzeigen " << endl; cout<<" [f] Kunden suchen " << endl; cout<<" [l] Einlesen der Kundendaten " << endl; cout<<" [q] Programm beenden " << endl; cout<<"*********************************************** " << endl; cout<<endl; cout<<"Auswahl: "; cin >> Eingabe; switch (Eingabe) { case 'n': system("cls"); cout<<"**************** Neuer Kunde *******************" << endl; cout<<"Geben Sie den Vornamen ein: "; cin >> Value; KundenFeld[DatNr].nr = DatNr; KundenFeld[DatNr].vorname = Value; system("cls"); cout<<"**************** Neuer Kunde *******************" << endl; cout<<"Geben Sie den Nachnamen ein: "; cin >> Value; KundenFeld[DatNr].nachname = Value; DatNr=DatNr +1; system("cls"); break; case 'a': system("cls"); cout << "************** Ausgabe der Kundendaten **************" << endl; for (i = 0; i < DatNr; i++) { cout << " Kundennummer : " << KundenFeld[i].nr << endl; cout << " Vorname : " << KundenFeld[i].vorname << endl; cout << " Nachname : " << KundenFeld[i].nachname << endl; cout << endl; } break; case 's': fKunde.open("Kunde.dat", ios::out); for (i = 0; i<100; i++) { fKunde << KundenFeld[i].nr << ";"; fKunde << KundenFeld[i].vorname << ";"; fKunde << KundenFeld[i].nachname << ";" << endl; } fKunde.close(); break; case 'd': system("cls"); cout << "************** Kundendaten löschen **************" << endl; for (i = 0; i < DatNr; i++) { cout << " Kundennummer : " << KundenFeld[i].nr << endl; cout << " Vorname : " << KundenFeld[i].vorname << endl; cout << " Nachname : " << KundenFeld[i].nachname << endl; cout << endl; } break; case 'q': return 0; break; system("Pause"); } } }/edit pumuckl: schließenden code-Tag spendiert.
-
1. Minimales Code-Beispiel.
2. Konkrete Fragen stellen.
3. Bei Zeile 3 schon hast du einen Fehler.
-
eine Reaktion auf die Antworten in http://www.c-plusplus.net/forum/313887 bevor Du neue Fragen stellst wäre auch nicht schlecht
-
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
-
...
-
Swordfish schrieb:
std::ofstream::ofstream. Öffne die Datei im Modus
ios::truncund 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.
-
...
-
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

-
...