EINFAH mall Vorebi schauen und HELFEN !!!
-
-
Welchen Wert hat denn 'i' in deinem Programm?
Gib den doch mal aus. Ich kann nämlich nicht erkennen, dass du
'i' einen Wert zuweist geschweigedenn definierst, oder habe ich was übersehen?
-
Ich hab denn Oberen Text etwas verändernt ! da ich ein kleinen fehler endekt habe!
So i wird hier def.
void menu(); // Funktion für Menüaufruf
void oeffnen();
void ausgabe();
void eingabe();
void speichern();
void aendern();int i=0, j; // <----------Laufvariable
int auswahl=1; // AuswahlvariableFILE *Datei;
Ich hab denn Fehler noch nicht gefunden
Hallo,
und hier auch vielleicht mal vorbeischauen:
Hilfe
Hilfe 2P.s Ich kann nicht dafür das ich seit 3 Jahren in Deutschland bin! Vielleicht stimmt meine Rechtschreibung nicht aber dafür kann ich gut Sprechen!!! :p
-
Ach ja bevor ich Ganz vergessen habe kann mir einer BITTE ein tipp, geben wie ich eine Löschfunktion machen kann ?
z.B wie ich Datensätze Löshe, zu den oberen Bsp.
Das währe sehr nett!!!
-
Fiktor schrieb:
Ach ja bevor ich Ganz vergessen habe kann mir einer BITTE ein tipp, geben wie ich eine Löschfunktion machen kann ?
z.B wie ich Datensätze Löshe, zu den oberen Bsp.
Das währe sehr nett!!!
Alle Daten bis auf den der gelöscht werden soll in eine neue Datei schreiben.
Das wurde aber schon öfter mal gepostet. Benutz doch mal die Suchfunktion.
Btw. dein Code ist mir schleierhaft. Was soll denn diese aendernfunktion machen ? Ich meine man soll eine gesuchte Kundennummer eingeben. Hat man das getan wird getestet ob der aktuelle Datensatz diese Nummer hat, wenn nicht wird man wieder nach der Nummer gefragt.
Ich mein das ist doch keine Suche.
Ich würde an deiner Stelle mal ne STL-Referenz zu Rate ziehen. Da gibt es einiges was dir das Leben wesentlich einfacher macht.
-
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 ?!?!?