EINFAH mall Vorebi schauen und HELFEN !!!
-
Die Änder Funktion ist sehr wichtig
wenn mann z.B sich vertippt hat bei Kundenummersuche !
Oder wenn ich mehhrere Rechnungen verändern will, brauch ich dann das prog. nich jedesmall neue zu Starten!Sondern es wird weiter gesucht!Aber das Prob ist das er nur denn Letzten eintrag finden und nich die davor eingegeben waren, Keine Ahnung warum villeicht kanste mir da weiter helfen ?
hier ist ein Link wo ihr das näher anschauen könnt
http://home.arcor.de/fiktor/C++Aufgabe.cppP.s zu Löschfunktion hab ich nicht nützliches gefunden was mir weiter helfen soll
Tschunldigung für meine Rechtschreibung! Begründung siehe OBEN
-
Hallo,
Was die Funktion eigentlich machen soll ist mir schon klar, aber was dein Code soll ist mir schleierhaft; der erfüllt den Zweck doch garnicht. Oder hab ich das alles falsch verstanden ?
Achso was das löschen angeht. Am einfachsten ist es wie oben schon geschrieben, alle Daten bis auf den die die gelöscht werden sollen in eine neue Datei zu schreiben und die alte Datei zu löschen.
-
Hallo
Zu Löschfunktion ! es geht mir darum denn Komlpeten Datensatz zu Löschen und nicht nur bestimmten nahmen! So du meintest "Die Alte Datei zu Löschen" mit welchen befehl Lösche ich sie?!?! ich hab Keine Ahnung wie ich das mache, da ich nur ein Anfänger in C++ Bin, villeicht kannste mir ein BSP geben?
Zu dem Code es ist mir schon klar dass er sein Zweck nicht erfühlt!
Deswegen hab ich hier um Hilfe gebettet was die Änderfunktion angeht, mir ist nicht klar warum es nicht funktioniert!
http://home.arcor.de/fiktor/C++Aufgabe.cppP.s ich danke dir das du zeit genommen hast dir die sahe anzuschauen
-
Hallo,
Ok. Also folgendes. Ich würde dir dringend raten deine Anwendung "umzubauen".
Deswegen hab ich dir den Tip mit der STL gegeben.
Zunächst mal würde ich mir eine Klasse für den Datensatz schreiben.
Günstig wäre es z.B. operator>> für std::ifstream und std::ofstream zu überladen. Ich weiss ja nicht wieviele dieser Datensätze du hast. Wenn es nicht übermäßig viele sind wäre es auch denkbar einefach eine std::vector oder std::map am Programanfang mit den Daten zufüllen und dann die Operationen im Speicher duchrzuführen und zum Schluss das Ergebnis wieder in die Datei schreiben.Das könnte dann so aussehen:
//Program.h #ifndef prefPROGRAM_H #define prefPROGRAM_H #include <string> #include <fstream> using namespace std; //diese Klasse enthält später die Daten die du momentan in deiner Strukt hast //du kannst sie natürlich auch weiterhin in der Strukt lassen class Program{ private: //ich beschränke mich mal auf einen member unsigned long m_customer_id; public: Program(const unsigned long id):m_customer_id(id){} Program():m_customer_id(0){} ~Program(){} void SetId(const unsigned long id){m_cutomer_id=id;} const unsigned long GetId(void){return m_customer_id;} const Program &operator=(const Program &p){ if(this != &p) m_customer_id=p.GetId(); return *this; } //weitere member für zugriff auf attribute (die die ich jetzt weg gelassen habe) }; ifstream &operator>>(ifstream &in,const Program &p){ unsigned long t; //hier würde nacheinander alles eingelesen in>>t; p.SetId(t); return in; } ofstream &operator<<(ofstream &out,const Program &p){ out<<p.GetId(); return out; } #endif
Dann eine Klasse die das Handling der Daten übernimmt
//Manager.h #ifndef prefPROGRAMMANAGER_H #define prefPROGRAMMANAGER_H #include<map> #include<string> #include "program.h" using namespace std; class PManager{ private: map<unsigned long,Program> m_pmap; public: PManager(){} ~PManager(){} const bool Load(const string); const bool Save(const string); Program ByID(const unsigned long); //liefert eine Datensatz über die Kundennummer void Add(const Program &); void Delete(const unsigned long); }; #endif
Die dazu gehörige cpp
#include "manager.h" #include <fstream> const bool PManager::Load(const string path){ ifstream fin(path); if(!fin.is_open()) return false; Program pins; while(!fin.eof()){ fin>>pins; m_pmap[pins.GetId()]=pins; } fin.close(); return true; } const bool PManager::Save(const string path){ ofstream fout(path); if(!fout.is_open()) return false; map<unsigned long,Program>::iterator it; for(it=m_pmap.begin();it!=m_pmap.end();it++) fout<<*it<<endl; fout.close(); return true; } Program PManager::ByID(const unsigned long id){ return m_pmap[id]; //wenn nicht vorhanden wird ein object mit id=0 zurück gegeben was wir dann einfach als leeres objekt betrachten } void PManager::Add(const Program &p){ m_pmap[p.GetId()]=p; } void PManager::Delete(const unsigned long id){ if((map<unsigned long,Program>::iterator it=m_pmap.find(id))!=m_pmap.end()) m_pmap.erase(it); }
Das ist jetz wirklich nur um zu zeigen wie du es dir einfacher machen kannst.
Jetzt kannst du dich an das eigentliche Program machen.
Meinetwegen für die Ändernfunktion#include "manager.h" #include <iostream> using namespace std; //vorher hast du ne instanz von PManager erzeugt und sie mit Load gefüllt void aendern(const PManager &pm){ unsigned long id,nid; string saveto="/home/foo/bar.txt"; Program cur; cout<<"Gesuchte Kundennummer: "; cin>>id; cur=pm.ByID(id); if(cur.GetId()){ //hier änderst du natürlich eigentlich die anderen daten alle cout<<"Neue Kundennummer: "; cin>>nid; pm.Delete(id); cur.SetId(nid); pm.Add(cur); } //jetz kannst ja noch mal fragen ob gespeichert werden soll //oder du gehst halt zurück zum hauptmenu und speicherst bei program ende //jetzt speichern mit if(pm.Save(saveto)) cout<<"Gespeichert"<<endl; else cout<<"Hmmm gotta go now :D"<<endl; }
Wenn es natürlich zu viel Daten sind kannst du mittels der überladenen fstream operatoren ne angepasste aendern funkion schreiben. Da müsste die Suche dann allerding direkt in der Datei statt finden, was sich aber auch recht leicht dastellt dann.
Das ist alles ungetestet und nicht abgesichert. Es soll dir ja auch nur ne Richtung zeigen.
-
Ich Danke dir sehr, das du dich bemüht hast und das da Oben alles Geschrieben
ABER Leider von demm da Oben versteh ich nur ein Bruchteill
es Liegt daran das ich grad mit C++ in meiner Ausbildung angefangen habe und das wir Leider nich so weit sind mit der Objektorientierten Programmierung
Wie du hier siehst
http://home.arcor.de/fiktor/C++Aufgabe.cpp ist das ein Premitieves Prog.
es Liegt nähmlich daran das wir, wie gesagt, Leider nicht so weit sind.Ich BEDANKE mich Trodzdemm für deine Mühe und deine Zeit!!!
P.s villeicht kannste mir ja auf Primetiven weg helfen ?
Das wäre sehr nett
-
Hallo,
öhm ok.
//------ snip -------------- void foo(){ char x; unsigned long kn; STRUCT str; FILE *file; if((file=fopen("C:\\Datei.txt","rb+"))==NULL){ cout<<"Konnte Datei nicht oeffnen"<<endl; return; } do{ cout<<endl<<"Kundennummer ?: "; cin>>kn; while(!feof(file)){ //[Edit] muss natürlich !feof() heissen [/Edit] fread(&str,sizeof(STRUCT),1,file); if(str.kundennummer!=kn) continue; else{ cout<<"Datensatz gefunden"<<endl; //ausgeben der felder wie du es schon gemacht hast cout<<"Neuer Rechnungsbetrag: "; cin>>str.rn; fseek(file,sizeof(STRUCT)*-1,SEEK_CUR); fwrite(&str,sizeof(STRUCT),1,file); break; } } rewind(file); cout<<"Erneut suchen?: "; cin>>x; }while(x!='n'); fclose(file); } //--------- snap ------------
Das ist jetzt bis auf die iostream Klassen alles mehr C.
Der Code aus dem Beispiel arbeitet ja mit nem Array der Strukts. Das bedeutet das die eigentliche Operation im Speicher ausgeführt wird. In der obigen Version, wird es direkt in der Datei gemacht. Sollte aber kein Problem sein das anzupassen.Du hast doch die Musterlösung da auf der Seite auf die dein Link verweisst, warum nimmst du sie nicht ?
-
Hallo,
Danke erstamall für den Code,!! malsehen ob es bei mir Klapt
Ja zu demm Link! Das ist mein vollständiges Prog bei demm die Änderfunktion nicht funktioniert und die Löschfunktion nicht da ist, ich habs bloss verlinkt damit hier der Forum nicht ünötigt Vergrössert wird!
P.s Danke nochmalls
Unter P.s ähmm wie siehts eigentlich mit Lösch Funktion aus
Bittö ein Tipp
-
Hallo,
bzwgl. der Löschfunktion. In deinem Beispiel hast du ein Array von Strukts.
Man könnte zum Beispiel den Strukts ein Flag geben das angibt ob sie gelöscht sind.struct MyStruct{ bool deleted; //der rest kommt hier }; MyStruct PROGRAM[100]; void löschen(){ unsigned long kn; cout<<"Kundennummer des zu löschenden Datensatzes: "; cin>>kn; for(int i=0;i< 100;i++) PROGRAM[i].deleted=(PROGRAM[i].kn==kn) ? true : false; } //dann rückschreiben der Daten void Save(void){ FILE *out; if((out=fopen("/home/bla.txt","wb"))==NULL){ cout<<"Hilfe"<<endl; return; } for(int i=0;i< 100; i++) if(!PROGRAM[i].deleted) fwrite(&PROGRAM[i],sizeof(MyStruct),1,out); fclose(out); } //jetzt befinden sich nur Datensätze die nicht gelöscht wurden in der Datei
Um eine Datei von C aus zu löschen kannst du unlink() benutzen, nur so zur info.
-
Ähm folgendess Problemm, so ich hab ne Struktur (quassi Speicherplatz für 100 Datensätze) so wenn ich z.B 2 Daten sätzte eingegeben hab z.B den 1 mit 1 belegt habe und denn 2 mit 2 so wenn ich die 1 Ändern will also bei suche KnR 1 eingebe findet er das nicht wenn ich nochmall 1 eingebe (bei weter suchen dann findet er den Datensatz von 1) und ich kanns verändern
ES ist besser zu fersteehen wenn du die Ganze sache selber anschaust
http://home.arcor.de/onkel_viktor/Aufgabe.cpp bzw Compelierst und Ausführst
Gib als 1 Überall 1sen ein und als 2 eintrag 2en an !
so dan bei Bearbeiten 1 suchen und dann nochmall bei wetersuchen wieder die 1 dann findet er die !
-
Hallo,
Die Addresse auf die der Link verweisst existiert nicht.
-
Sorry mein Fehler, Ich depp ! Ich hab denn Link umgeändert
hier ist er nochmall http://home.arcor.de/onkel_viktor/Aufgabe.cpp
Sorry nochmall
P.s Kansste mir auch sagen wie ich Drucke z.B wenn stellen mit 0 belegt sind, soll es Gedruckt werden?!?!
-
Sorry, jetzt versteh ich dein Prolem nicht genau. Was läuft denn jetzt schief bei der ändern-Funktion ?
btw. Hast du gesehen dass in deinem Code (der vom Link) die ändern-funktion immer noch falsch ist ? Du hast dort nur eine Schleife.
-
Ja dein COde war nur für eine Struktur belegt meiner muss für 100 Datensätze sein d.h das er in 100 Datensätze nach 100 Eingaben dursucht und findet denn Entsprechenden Kunden Nr.
Das Problemm ist wie soll ich ne 2 Schleiffe Rein Kriegen oder Bzw Warum findet er beim 2 Suchanlauf die Nr 1 und nicht gleich beim 1sten?!?!
Downloade dir die Datei unter http://home.arcor.de/onkel_viktor/ die Datei.txt und pack sie auf C:\ und dann Starte das Prog und versuche die Kundenr 1 Zu finden (Die findest du nicht) dann weiter suchen dann nochmall die Kunden Nr 1 (Dann findest du die) ich Frage mich warum findet er die beim 1 mall nicht?!?!?
-
Weil du garnicht suchst. Das ist das was ich dir die ganze Zeit sagen will.
Deine Schleife ist falsch.
Du musst die Datensätze durchlaufen.for(int i=0;i<100;i++) if(STRUCT[i].kn==gesucht) //tu was
Du fragst immer wieder nach der Nummer in deinem Code und gehst garnicht die Datensätze durch. Egal was man eingibt, man kommt immer zum nächst höheren.
-
HALLO
Stimmt ja ich DEPP
Aber jetzt ein ANderes Prob so Wie kann ich die Datensätze die mit NULL belegt sind DRUCKEN !?!?!? Das haben wir ind der schule nicht Behandelt und im Buch ist das Ünverständlich an eine BSP erklärt
P.s Daanke nochmalls für deine Mühe
AJA befpr ich ganz vergesse was heisst diese Befehl hier rewind(Datei); oder was bewirkt er ?!?!?
-
Fiktor schrieb:
HALLO
Stimmt ja ich DEPP
Aber jetzt ein ANderes Prob so Wie kann ich die Datensätze die mit NULL belegt sind DRUCKEN !?!?!? Das haben wir ind der schule nicht Behandelt und im Buch ist das Ünverständlich an eine BSP erklärt
P.s Daanke nochmalls für deine Mühe
Das geht nicht mit standart c++. C++ kennt keinen Bildschirm oder Drucker oder ähnliches; Es kennt nur Datenströme. Da du auf windows arbeitest musst du mal nach OS-spezifischen funktionen gucken. Ne umleitung an LPT1 per pipe oder sowas evtl.
Fiktor schrieb:
AJA befpr ich ganz vergesse was heisst diese Befehl hier rewind(Datei); oder was bewirkt er ?!?!?
rewind setzt den Filepointer an den Anfang der Datei und ist gleichbedeutent mit fseek(datei,0L,SEEK_SET)
-
HALLO
Ähm kannste mir auch sagen wie ich Datensätze Köschen kann ?!?!
Ich hab mir das so Überlegt ich suche erstamll KNR. dann Komlpeten datensatz Löschen!
Aber ich hab keine Idee wie ich das einstellen kann
-
Hallo,
das hab ich doch nun schon ein paar mal gesagt.
Dein Program läuft ja folgendermaßen:
1. Programstart
2. Daten aus Datei in Structarray lesen
3. Menu
4. Structarray zurück in Datei schreibenWenn du nun in einer Löschfunktion im entsprechenden Datensatz das gelöscht-falg setzt, wird dieser Datensatz am End nicht wieder in die Datei geschrieben, was einem Löschen entspricht.
-
HALLO
ICH KÖNNTE HEULEN
Beim Testen der Ändefunktion ist mir ein fehler unterlaufen und zwar, er findet jetzt denn 1 Eintrag aber denn 2 nicht mehr geschweige von 3ten
Hier ist de COde kannste mir BITTE Sagen was ich Falsch gemacht habe?
void aendern() { char x; int suche; clrscr(); Datei=fopen("C:\\Datei.txt","r+"); fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); do { Datei=fopen("C:\\Datei.txt","r+"); fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); cout<<"Bitte gesuchte Kundennummer eingeben: \t"; cin>>suche; for(int i=0;i<100;i++) { if(suche == STRUKT[i].knr) { cout<<"\n\nKundennummer:\t\t\t"<<STRUKT[i].knr<<"\n"; cout<<"Rechnungsbetrag:\t\t"<<STRUKT[i].rb<<"\n\n"; cout<<"Alter Rechnungsbetrag: "<<STRUKT[i].rb<<"\n"; cout<<"Neuer Rechnungsbetrag: \n"; cin>>STRUKT[i].rb; fseek(Datei,sizeof(STRUKT[i])*-1,SEEK_CUR); fwrite(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); fclose(Datei); } i++; } cout<<"Wollen Sie weiter suchen? Ja/Nein: "; cin>>x; } while(x!='n'); fclose(Datei); cout<<"\nWeiter mit beliebiger Taste..."; getch(); clrscr(); menu(); }
P.s SOrry für meine Dummheit da ich grad mit C++ angefangen habe kann ich nicht so richtig Programmieren
-
Hallo,
das hat nix mit C++ zu tun. Du hast noch einen Denkfehler.
Deine Schleife hast du jetzt angepasst, d.h. du gehst die Datensätze durch. In der selben Funktion fummelst du schon in der Datei rum. Warum ?
Es reicht zunächst die Daten im Speicher zu ändern und am Ende des Programs bzw. am Ende der Ändernfunktion (wenn alles was geändert werden sollte im speicher geändert ist) die alte Datei mit den neuen Daten zuüberschreiben. Das ist alles.