EINFAH mall Vorebi schauen und HELFEN !!!
-
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.
-
Ich hab den Fehler endekt
und zwar
void aendern() { char x; int suche,i=0; do { clrscr(); Datei=fopen("C:\\Datei.txt","r+"); fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); while(!feof(Datei))//<<<<<DARAN LAGS!!!!!!! { cout<<"Bitte gesuchte Kundennummer eingeben: "; cin>>suche; for(int s=0;s<100;s++) { if(suche == STRUKT[i].knr) { cout<<"Leasingvertragsnummer:\t\t"<<STRUKT[i].lvnr<<"\n"; cout<<"Leasingobjektnummer:\t\t"<<STRUKT[i].lonr<<"\n"; cout<<"Leasingobjektbezeichnung:\t"<<STRUKT[i].lob<<"\n"; cout<<"Kundennummer:\t\t\t"<<STRUKT[i].knr<<"\n"; cout<<"Kundennamen:\t\t\t"<<STRUKT[i].kn<<"\n"; cout<<"Strasse:\t\t\t"<<STRUKT[i].str<<"\n"; cout<<"PLZ:\t\t\t\t"<<STRUKT[i].plz<<"\n"; cout<<"Ort:\t\t\t\t"<<STRUKT[i].ort<<"\n"; cout<<"Leasingbeginn(Tag):\t\t"<<STRUKT[i].lbtag<<"\n"; cout<<"Leasingbeginn(Monat):\t\t"<<STRUKT[i].lbmonat<<"\n"; cout<<"Leasingbeginn(Jahr):\t\t"<<STRUKT[i].lbjahr<<"\n"; cout<<"Leassingende(Tag):\t\t"<<STRUKT[i].letag<<"\n"; cout<<"Leassingende(Monat):\t\t"<<STRUKT[i].lemonat<<"\n"; cout<<"Leassingende(Jahr):\t\t"<<STRUKT[i].lejahr<<"\n"; cout<<"Rechnungsbetrag:\t\t"<<STRUKT[i].rb<<"\n\n"; cout<<"Alter Rechnungsbetrag: "<<STRUKT[i].rb<<"\n"; cout<<"Neuer Rechnungsbetrag: "; cin>>STRUKT[i].rb; fseek(Datei,sizeof(STRUKT[i])*-1,SEEK_CUR); fwrite(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); fclose(Datei); fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); } i++; fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); } } } while(!feof(Datei)); cout<<"\nWeiter mit beliebiger Taste..."; getch(); clrscr(); return; }
so er findet alle einträge und gibt die alle aus! Dan kann ich alle einträge Verändern "HURA EIN WUNDER"
Ich hab denn COde etwas Umgeschrieben, Naja Guck es dir an und sag was besse zu machen wäre oder sag mir bescheid wenn du ein BUG endeckt hasst, ok ?Hier ist das Kommlete Prog.
-
Hallo,
Warum fummelst du denn immer noch in der Datei rum ?
Das kann man natürlich machen, aber bei 100 Datensätzen kannst du das doch locker im Speicher machen und erst zum Schluss zurück schreiben.
Also wenn ich deine obige version nur etwas änder erhält man.void aendern() { char x; int suche,i=0; FILE *Datei; Datei=fopen("C:\\Datei.txt","rb"); //einlesen aller Datensätze in das Array while(!feof(Datei)){ fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); i++; } fclose(Datei); //eingelesen //ändern schleife do{ clrscr(); cout<<"Bitte gesuchte Kundennummer eingeben: "; cin>>suche; for(int i=0;i<100;i++){ //hier stand vorher s=0 usw. s wurde nie definiert if(suche == STRUKT[i].knr) { cout<<"Leasingvertragsnummer:\t\t"<<STRUKT[i].lvnr<<"\n"; cout<<"Leasingobjektnummer:\t\t"<<STRUKT[i].lonr<<"\n"; cout<<"Leasingobjektbezeichnung:\t"<<STRUKT[i].lob<<"\n"; cout<<"Kundennummer:\t\t\t"<<STRUKT[i].knr<<"\n"; cout<<"Kundennamen:\t\t\t"<<STRUKT[i].kn<<"\n"; cout<<"Strasse:\t\t\t"<<STRUKT[i].str<<"\n"; cout<<"PLZ:\t\t\t\t"<<STRUKT[i].plz<<"\n"; cout<<"Ort:\t\t\t\t"<<STRUKT[i].ort<<"\n"; cout<<"Leasingbeginn(Tag):\t\t"<<STRUKT[i].lbtag<<"\n"; cout<<"Leasingbeginn(Monat):\t\t"<<STRUKT[i].lbmonat<<"\n"; cout<<"Leasingbeginn(Jahr):\t\t"<<STRUKT[i].lbjahr<<"\n"; cout<<"Leassingende(Tag):\t\t"<<STRUKT[i].letag<<"\n"; cout<<"Leassingende(Monat):\t\t"<<STRUKT[i].lemonat<<"\n"; cout<<"Leassingende(Jahr):\t\t"<<STRUKT[i].lejahr<<"\n"; cout<<"Rechnungsbetrag:\t\t"<<STRUKT[i].rb<<"\n\n"; cout<<"Alter Rechnungsbetrag: "<<STRUKT[i].rb<<"\n"; cout<<"Neuer Rechnungsbetrag: "; cin>>STRUKT[i].rb; break; //wir haben ja einen Eintrag gefunden }//end if }//end for //hier landest du nach nem break cout<<"Noch einen Datensatz aendern ?:"; cin>>x; }while(x!='n'); //es sollen keine Sätze mehr geändert werden //jetzt schreiben wir die geänderten Daten zurück //Datei im Schreibmodus öffnen (Daten werden gelöscht) Datei=fopen("C:\\Datei.txt","wb"); for(int i=0;i<100;i++) fwrite(&STRUCT[i],sizeof(Program),1,Datei); fclose(Datei); //Daten sind zurück geschrieben //Funktion verlassen return; }
Verstehst du was ich sagen will ? In deinem Code waren noch ein paar Sachen nicht so ganz toll.
-
Hallo ich hab die Änder funktion von dir Getestet und mir ist aufgefahlen
Nach demm Verändern des wertes, kommt Menu und wenn ich auf Ausgabe Kliche gibt er mir 100 Mall 0 Aus!
So ich versuche jetzt denn Fehler zu finden
Aja ich hab das Prog um 2.00 Nachts noch Geschrieben daswegen Hab ich Vergessen das man in der Datei nicht Rumfummeln soll
Danke Nochmalls !
Aja bevor ich ganz vergesse was mir aufgefahlen ist
void aendern() { //<-Hier Öffnest du die Void auf char x; int suche,i=0; FILE *Datei; Datei=fopen("C:\\Datei.txt","rb"); //einlesen aller Datensätze in das Array while(!feof(Datei)){ fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); i++; } //<----------Und Zwar das hier (Und Hier schleisst du die ) Muss das sein :confused: fclose(Datei);
-
Hallo,
Welche Ausgabe meinst du ? Ich hab doch garkeine Ausgabe geschrieben.
Bei der Ändern funktion wird nur der Datensatz ausgegeben bei dem die knr mit der eingegebenen übereinstimmt.Zu deinem andren Problem. Das ist ok weil ich nicht die Funktion schliesse:
void aendern() { //<-Hier Öffnest du die Void auf char x; int suche,i=0; FILE *Datei; Datei=fopen("C:\\Datei.txt","rb"); //einlesen aller Datensätze in das Array while(!feof(Datei)){ //<----------------- Hier mach ich eine Klammer für while auf ;) fread(&STRUKT[i],sizeof(STRUKT[i]),1,Datei); i++; } //<----------Und Zwar das hier (Und Hier schleisst du die ) Muss das sein fclose(Datei);
-
Ne ich meinte die Änderfunktion - Wenn ich ein Wert verändere so und dann weiter ins menu Gehe dann Klicke ichs aufs Ausgabe dann gibt er mir 100 mall 0 Aus!Er verändert den wert Garrnicht.
Es Liegt an der Änder funktion denk ich mall das er 100 Datensätze mit 0 Belegt
Was noch seltsammer ist ist das wenn er 100 Mall 0 Ausgegeben hat und ich wieder ins Verändern menue Gehe und dann Nach nummer 2 Suche findet er die
und gibt denn wert aus denn ich Belegt habe so ich veränder den wert z.B auf 222 so dann (Ich will nicht weiter suchen ) gehe ins Menu und dann aufs Ausgabe und er Gibbt mir nochmall 100 Nullen aus!?!? soich geh nochmall ins Ändermenu und gebe Den datensatz mit KNr 2 und er findet ihn und gibt mir aus das der Betrag mit 222 Belegt ist.
Warum Zeigt er mir dann bei Ausgabe 100 Mall 0 und bei Veränderfinktion findet er den Entsprechenden Datensatz ?
-
Hallo,
Um herauszufinden warum das so ist müsste ich mal deine Ausgabe und Menufunktion sehen. Und was meinst du eigentlich die ganze Zeit mit: Er belegt die Datensätze mit 0 ???
-
Hallo,
Hier ist der Link zu Kompletten Prog mit deine Änderfunktion
http://home.arcor.de/onkel_viktor/Sieht besser aus.cpp
So Kopier das, Compeliere, gib 3 Daten sätze ein z.B Alles mit 1 dann mit 2 dann mit 3.
Und versuchs es dann zu Verändern nach demm du das veränadert hast gehe aufs Ausgeben und dann siehste was ich meinnte
MfG Viktor
-
Ok moment.
Vielleicht ist es einfacher wenn du mir mal deine E-mail addresse gibst. Dann blähen wir dat Forum nicht unnötig auf.
-
Ok.
Hier Meine Mail Onkel_Viktor@lycos.co.uk
Hier ist meine ICQ (Ich denke geht schneller) 261204225
P.s Fängt deine ICQ so an 143.....?!?!
-
Dabei zu beachten das Zwischen Onkel und Viktor ein Strich ist "So einer _ "
Wollte bloss auf nummer sicher gehen
-
Hallo,
die mail ist raus.... Ich hab den code kommentiert.
-
HALLO
Ähm noch ne Frage
was hat das hier zu Bedueten oder wofür das da ist ?
#pragma argsused
-
Kannst du getrost rauslöschen. Hab ich vergessen. Das ist ein pragma für meinen Compiler.
-
Hab schon angst gekriegt LOL
Danke !!!P.s
Sorry aber ich hab noch nicht gaanz kapier wie du die Sache Löschst, hab den Gaanzen Code Durchgegangen und mir ist nicht klar wo er hin Spring nach der
if(antwort=='j') STRUKT[i].deleted=true; //deleted flag setzen else STRUKT[i].deleted=false;
Kannste mir da Bittö Erklären
-
Also, wenn man 'j' eingibt setzt er die eigenschaft delete der aktuellen STRUKT auf true. Das bedeutet das er als gelöscht markiert wurde. In der Save funktion schreibe ich NUR die Datensätze in die Datei deren deleted eigenschaft FALSE ist. Auf diese Weise realisiere ich das Löschen. Die Ausgabe wurd so angepasst dass sie ebenfalls nur Datensätze anzeigt die das deleted auf false haben.
-
Aso stimmt ja
Aber die Datensätze die Quassi Gelöscht sind Bleiben ind der test.txt Trodzden da werden aber nicht ausgegeben !
Nicht schlecht die idee
-
Hallo,
nich ganz. Sie sind in der txt auch nicht vorhanden. Weil ich sie nicht mehr reinschreibe wenn sie das delete flag gesetzt haben. Du kannst dir die Datei ja mal nach dem Löschen eines Satzes angucke und davor.