HILFE! verkettete liste
-
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> struct ID3Tag/*structur eigener datentyp */ { char Titel[31]; /* initialisierung von arrays, char variable mit länge 30*/ char Interpret [31]; char Album[31]; char Erscheinungsjahr[5]; char Kommentar[31]; char Genre[4]; struct ID3Tag *next; }ID3Tagstructur; struct ID3Tag *kopf, *ende; char menueAnzeigen (int i_menue); void Anzeigen (void); void Hinzufuegen (void); void ListeHinzufuegen (void); void ListeAnzeigen (void); void liste_initialisieren(void); void Datei_oeffnen (void); void Datei_speichern (void); void getGarbage (void); // ID3Tag myID3Tag [10];/* 10 Felder sind reserviert vom typ ID3Tag*/ /* Datentyp,Variable,10Felder*/ void main() { char c_Eingabe; liste_initialisieren (); /* strcpy (myID3Tag[0].Titel,"");/* Kopieren von einem string in array von char strcpy (myID3Tag[0].Interpret,""); strcpy (myID3Tag[0].Album,""); strcpy (myID3Tag[0].Erscheinungsjahr,""); strcpy (myID3Tag[0].Genre,""); */ c_Eingabe = menueAnzeigen (1); } void liste_initialisieren(void) { kopf = (struct ID3Tag*) malloc(sizeof(struct ID3Tag)); ende = (struct ID3Tag*) malloc(sizeof(struct ID3Tag)); if (kopf == NULL || ende == NULL) { printf (".......Speicherplatzmangel\n"); exit(1); } kopf->next = ende->next = ende; } void Datei_oeffnen (void) { FILE *pfile; char Dateiname[14]; /*3 stellen fuer txt, 1 stelle fuer punkt, 8 stellen fuer namen und 1 stelle fuer nullterminierung*/ int DatensatzNr =1; struct ID3Tag *ID3Data; strcpy (Dateiname, "test.txt"); if ((pfile=fopen(Dateiname,"r")) == NULL) { printf("Fehler : Die angegebene Datei kann nicht geoeffnet werden\n"); exit(0); } while (fread(&ID3Tagstructur, sizeof(ID3Tagstructur),1, pfile)==1) { // Schleife durchlaufen bis Datei Ende // Neuen Speicher für Element reservieren ID3Data = (struct ID3Tag*) malloc(sizeof(struct ID3Tag)); // Ist noch genügend Speicher vorhanden? if (ID3Data == NULL) { printf ("... kein Speicher!"); exit (1); } // Daten in Element kopieren strcpy (ID3Data->Titel, ID3Tagstructur.Titel); strcpy (ID3Data->Album, ID3Tagstructur.Album); strcpy (ID3Data->Interpret, ID3Tagstructur.Interpret); strcpy (ID3Data->Kommentar, ID3Tagstructur.Kommentar); strcpy (ID3Data->Erscheinungsjahr, ID3Tagstructur.Erscheinungsjahr); strcpy (ID3Data->Genre, ID3Tagstructur.Genre); printf ("Titel:%s\n",&ID3Tagstructur.Titel); printf ("Interpret:%s\n",&ID3Tagstructur.Interpret); printf ("Album:%s\n",&ID3Tagstructur.Album); printf ("Erscheinungsjahr:%s\n",&ID3Tagstructur.Erscheinungsjahr); printf ("Kommentar:%s\n",&ID3Tagstructur.Kommentar); printf ("Genre:%s\n\n",&ID3Tagstructur.Genre); // Element einfügen und Zeiger auf nächstes Element setzen ID3Data->next = kopf; kopf = ID3Data; } printf ("Titel", &kopf->Titel); /* Datei schliessen */ fclose(pfile); //printf ("\n%d Datensaetze wurden gelesen.\n", --DatensatzNr); } void Datei_speichern (void) { struct ID3Tag *ID3Data; int zaehler =0; char ch = 'n'; char Dateiname[14]; strcpy (Dateiname, "test.txt"); FILE *pfile; /* Datei wird geoeffnet*/ if ((pfile = fopen (Dateiname, "w+")) == NULL) { printf("Fehler: Die angegebene Datei kann nicht geoeffnet werden\n"); exit(0); } ID3Data = kopf; while (ID3Data != ID3Data->next) { // Daten in Element kopieren strcpy (ID3Tagstructur.Titel, ID3Data->Titel); strcpy (ID3Tagstructur.Album, ID3Data->Album); strcpy (ID3Tagstructur.Interpret, ID3Data->Interpret); strcpy (ID3Tagstructur.Kommentar, ID3Data->Kommentar); strcpy (ID3Tagstructur.Erscheinungsjahr, ID3Data->Erscheinungsjahr); strcpy (ID3Tagstructur.Genre, ID3Data->Genre); // In das File schreiben fwrite (&ID3Tagstructur, sizeof(ID3Tagstructur),1,pfile); zaehler++; ID3Data = ID3Data->next; } fclose (pfile); printf("\n\n Datensaetze wurden erfolgreich abgespeichert %d.\n", zaehler); } char menueAnzeigen (int i_menue) { bool gefunden=false; char c_Eingabe; switch (i_menue) { case 1: while (gefunden==false) { printf("********************************ID3-Tag Editor**********************************\n\n\n\n\n"); printf("Optionen:\n\n"); printf("(L)aden - "); printf("(S)peichern - "); printf("(H)inzufuegen - "); printf("S(u)chen - "); printf("(B)earbeiten - "); printf("Ent(f)ernen -\n"); printf("(A)usgabe - "); printf("B(e)enden\n\n"); c_Eingabe = getch(); switch (c_Eingabe){ case 'L' : case 'l' : printf("Daten werden geladen\n\n"); Datei_oeffnen(); break; case 'S' : case 's' : printf("Daten werden gespeichert\n\n"); Datei_speichern(); break; case 'H' : case 'h' : printf("Neuer eintrag:\n\n"); ListeHinzufuegen(); break; case 'u' : printf("Suchen ist noch nicht verfuegbar\n\n"); break; case 'B' : case 'b' : printf("Daten werden bearbeitet\n\n"); Hinzufuegen(); break; case 'f' : printf("Daten werden Entfernt\n\n"); break; case 'A' : case 'a' : printf("Ausgabe\n\n"); ListeAnzeigen();/*Anzeigen ist eine Prozedur mit Integer Parameter*/ break; case 'e' : printf ("Bis zum nechstenmal\n\n"); gefunden=true; break; default: printf("Falsche Taste!\n\n"); break; }/* Ende switch Eingabe*/ }/*Ende While SChleife*/ }/*Ende Switch Menue*/ return c_Eingabe; }/*Ende Funktion*/ void ListeAnzeigen () { struct ID3Tag *ID3Data; char ch = 'j'; ID3Data = kopf; while ((ID3Data != ID3Data->next) && ((ch=='j') || (ch=='J'))) { // Daten in Element kopieren strcpy (ID3Tagstructur.Titel, ID3Data->Titel); strcpy (ID3Tagstructur.Album, ID3Data->Album); strcpy (ID3Tagstructur.Interpret, ID3Data->Interpret); strcpy (ID3Tagstructur.Kommentar, ID3Data->Kommentar); strcpy (ID3Tagstructur.Erscheinungsjahr, ID3Data->Erscheinungsjahr); strcpy (ID3Tagstructur.Genre, ID3Data->Genre); // Daten anzeigen printf ("Titel:%s\n",&ID3Tagstructur.Titel); printf ("Interpret:%s\n",&ID3Tagstructur.Interpret); printf ("Album:%s\n",&ID3Tagstructur.Album); printf ("Erscheinungsjahr:%s\n",&ID3Tagstructur.Erscheinungsjahr); printf ("Kommentar:%s\n",&ID3Tagstructur.Kommentar); printf ("Genre:%s\n\n",&ID3Tagstructur.Genre); /* Schleife wiederholen, solange j oder J*/ printf ("\n Wollen Sie einen weiteren Datensatz anzeigen? (J/N)"); ch=getchar(); getGarbage(); ID3Data = ID3Data->next; } } void Anzeigen () { FILE *pfile; char Dateiname[14]; /*3 stellen fuer txt, 1 stelle fuer punkt, 8 stellen fuer namen und 1 stelle fuer nullterminierung*/ int DatensatzNr =1; strcpy (Dateiname, "test.txt"); if ((pfile=fopen(Dateiname,"r")) == NULL) { printf("Fehler : Die angegebene Datei kann nicht geoeffnet werden\n"); exit(0); } fread(&ID3Tagstructur, sizeof(ID3Tagstructur),1, pfile); printf ("Eintrag Nr. %d\n\n",DatensatzNr++); printf ("Titel:%s\n",ID3Tagstructur.Titel); printf ("Interpret:%s\n",ID3Tagstructur.Interpret); printf ("Album:%s\n",ID3Tagstructur.Album); printf ("Erscheinungsjahr:%s\n",ID3Tagstructur.Erscheinungsjahr); printf ("Kommentar:%s\n",ID3Tagstructur.Kommentar); printf ("Genre:%s\n",ID3Tagstructur.Genre); // ch=getchar(); /* Datei schliessen*/ fclose(pfile); printf ("\n%d Datensaetze wurden gelesen.\n", --DatensatzNr); } void ListeHinzufuegen (void) { /* Tastatureingabepuffer leeren*/ fflush(stdin); struct ID3Tag *ID3Data; char ch; do { // Neuen Speicher für Element reservieren ID3Data = (struct ID3Tag*) malloc(sizeof(struct ID3Tag)); // Ist noch genügend Speicher vorhanden? if (ID3Data == NULL) { printf ("... kein Speicher!"); exit (1); } printf ("Bitte um Eingabe:\n\n"); printf ("Geben Sie einen Titel ein:\n"); fflush(stdin); scanf ("%[^\n]",&ID3Tagstructur.Titel); getGarbage(); /* Inhalt wird geloescht aus C in 21 Tagen s.398*/ printf ("Titel:%s\n",ID3Tagstructur.Titel); printf ("Geben Sie einen Interpreten an:\n"); scanf ("%[^\n]",&ID3Tagstructur.Interpret); getGarbage(); printf ("Interpret:%s\n",ID3Tagstructur.Interpret); printf ("Geben Sie ein Album an:\n"); scanf ("%[^\n]",&ID3Tagstructur.Album); getGarbage(); printf ("Album:%s\n",ID3Tagstructur.Album); printf ("Geben Sie das Erscheinungsjahr an:\n"); scanf ("%[^\n]",&ID3Tagstructur.Erscheinungsjahr); getGarbage(); printf ("Erscheinungsjahr:%s\n",ID3Tagstructur.Erscheinungsjahr); printf ("Geben Sie ein Kommentar dazu an:\n"); scanf ("%[^\n]",&ID3Tagstructur.Kommentar); getGarbage(); printf ("Kommentar:%s\n",ID3Tagstructur.Kommentar); printf ("Geben sie das zugehoerige Genre an:\n"); scanf ("%[^\n]",&ID3Tagstructur.Genre); getGarbage(); printf ("Genre:%s\n",ID3Tagstructur.Genre); // In verkettete Liste einfügen strcpy (ID3Data->Titel, ID3Tagstructur.Titel); strcpy (ID3Data->Album, ID3Tagstructur.Album); strcpy (ID3Data->Interpret, ID3Tagstructur.Interpret); strcpy (ID3Data->Kommentar, ID3Tagstructur.Kommentar); strcpy (ID3Data->Erscheinungsjahr, ID3Tagstructur.Erscheinungsjahr); strcpy (ID3Data->Genre, ID3Tagstructur.Genre); ID3Data->next = kopf; kopf = ID3Data; /* structurvariable ID3Tagstructur speichern*/ //fwrite (&ID3Tagstructur, sizeof(ID3Tagstructur),1,pfile); /* Tastatureingabepuffer leeren*/ fflush(stdin); /* Schleife wiederholen, solange j oder J*/ printf ("\n Wollen Sie einen weiteren Datensatz eingeben ? (J/N)"); ch = getchar(); } while ((ch == 'j') || (ch == 'J')); } void Hinzufuegen () { char ch = 'n'; char Dateiname[14]; strcpy (Dateiname, "test.txt"); FILE *pfile; /* Datei wird geoeffnet*/ if ((pfile = fopen (Dateiname, "w+")) == NULL) { printf("Fehler: Die angegebene Datei kann nicht geoeffnet werden\n"); exit(0); } /* Daten eingeben und abspeichern*/ do { printf ("Bitte um Eingabe:\n\n"); printf ("Geben Sie einen Titel ein:\n"); // fflush(stdin); scanf ("%[^\n]",&ID3Tagstructur.Titel); getGarbage(); /* Inhalt wird geloescht aus C in 21 Tagen s.398*/ printf ("Titel:%s\n",ID3Tagstructur.Titel); printf ("Geben Sie einen Interpreten an:\n"); scanf ("%[^\n]",&ID3Tagstructur.Interpret); getGarbage(); printf ("Interpret:%s\n",ID3Tagstructur.Interpret); printf ("Geben Sie ein Album an:\n"); scanf ("%[^\n]",&ID3Tagstructur.Album); getGarbage(); printf ("Album:%s\n",ID3Tagstructur.Album); printf ("Geben Sie das Erscheinungsjahr an:\n"); scanf ("%[^\n]",&ID3Tagstructur.Erscheinungsjahr); getGarbage(); printf ("Erscheinungsjahr:%s\n",ID3Tagstructur.Erscheinungsjahr); printf ("Geben Sie ein Kommentar dazu an:\n"); scanf ("%[^\n]",&ID3Tagstructur.Kommentar); getGarbage(); printf ("Kommentar:%s\n",ID3Tagstructur.Kommentar); printf ("Geben sie das zugehoerige Genre an:\n"); scanf ("%[^\n]",&ID3Tagstructur.Genre); getGarbage(); printf ("Genre:%s\n",ID3Tagstructur.Genre); /* structurvariable ID3Tagstructur speichern*/ fwrite (&ID3Tagstructur, sizeof(ID3Tagstructur),1,pfile); /* Tastatureingabepuffer leeren*/ fflush(stdin); /* Schleife wiederholen, solange j oder J*/ printf ("\n Wollen Sie einen weiteren Datensatz eingeben ? (J/N)"); ch = getchar(); } while ((ch == 'j') || (ch == 'J')); fclose (pfile); printf("\n\n Datensaetze wurden erfolgreich abgespeichert.\n"); } void getGarbage (void) { char gabColl [80]; gets (gabColl); }
Hallo
Ich hab folgendes problem mit meiner verketteten liste:
beim menuepunkt speichern wird immer etwas mitreingespeichert das ich nicht eingegeben habe, ich denke es liegt an der abbruchbedingung der while schleife in der funktion speichern
was is falsch?
vielen dank für eure hilfe
-
*lol*
wir sind keine debugger.
Am besten gehst du mit deinem debugger schritt für schritt durch den code und dann merkst du schon wo und was er wie falsch macht - dann kannst du uns sagen:
in den zeilen x, y und z macht er bla bla obwohl er gugu machen soll, aber ich versteh das leider nicht.
und schon sind alle glücklich
-
Hmmm ich glaube du hast eher einen fehler in deiner verketteten liste gemacht.
Hab mir den Code mal angesehen...sag mal hast du das letzte element der liste (den pointer zur nächsten struktur) auf NULL gesetzt?! Du musst den PointerToNext der letzen Struktur in deiner Liste immer auf NULL setzen, sonst fuckt dein programm rum.