HILFE!!structs in datei ueberschreiben bzw ersetzen...



  • guuuten tag die herren (und damen natuerlich ;))

    habe folgendes problem. wir muessen als projekt in der fh ein "kleines" programm schreiben, welches auch soweit fast fertig ist.
    und zwar handelt es sich um einen terminplaner, inklusive kalenderblattansicht und
    eintragsverwaltung. es funktioniert fast alles bis auf die funktion bearbeiten und loeschen von eintraegen.

    die eintraege haben wir als structs realisiert, dh ein eintrag besteht aus einem struct mit folgenden elemente:

    struct termineintrag {
    char text[100];
    unsigned int tag, monat, jahr;
    unsigned int geb;
    };

    nach einlesen der einzelnen elemente wird das komplette struct mittels fwrite in eine datei geschrieben (binäär), was ebenso wie das auslesen auch funktioniert.
    nur das bearbeiten und damit auch das loeschen will nicht wie es soll 😞

    udn zwar haben wir uns die bearbeiten funktion so ausgedacht:
    wir lassen mittels fread in einer while schleife immer blockweise eine ganze struktur auslesen und vergleichen das datum des ausgelesenen termins mit dem der funktion uebergebenen datum.
    sobald diese gefunden wurde soll der eintrag einfach ueberschrieben bzw ersetzt werden. allerdings wird dabei immer die komplette datei ueberschrieben, das heisst er schreibt das neue struct einfch an den anfang der datei und loescht somit alle termine die danach stehen.
    ich vermute dass es entweder am fopen modus (wb+ oder r+...) liegt hab aber schon saemtliches probiert. fseek will auch nicht recht funktionieren 😞

    ich hoffe ich finde hier etwas unterstuetzung ich bin so langsam echt am verzweifeln.. 😞

    hier noch der code der bearbeiten funktion:

    int eintrag_bearbeiten(int tag, int monat, int jahr)   // gibts 1 zurueck falls der eintrag existiert!(funktioniert auch soweit ;))
    {
    	long z; 
    	fflush(stdin);
    	 termineintrag eintrag;
    	 termineintrag neu;
    
    	 neu.tag=tag;
    	 neu.monat=monat;
    	 neu.jahr=jahr;
    
       //printf("Eintrag gefunden! Bitte nun die neuen Daten eingeben:\n");
    	      // Text einlesen:
       printf("\n\nBitte den neuen Text eingeben(maximal 100 Zeichen): ");
       if (gets (neu.text) == NULL)
        {
                 fprintf (stderr, "Kann str nicht lesen!\n");
                 exit(1);
        }
    
      // Abfragen ob es sich um einen Geburstag handelt
      printf("\n\nIst es ein geburstag? (Ja = 1, Nein = 0): ");
      scanf("%u", &neu.geb);
      if (neu.geb != 1 && neu.geb != 0)
      {
    		 system("cls");
             printf("Falsche Eingabe! Bitte erneut versuchen\n");
             getch();
    		 fflush(stdin);
             //return 1;
      }
    
    	if (eintrag_check(tag,monat,jahr))
    	{
         // Dateinname festlegen!
         const char * const filename = "termine.dat";  // Dateiname kann hier geändert werden
    	 FILE *fp;
    
    	 // Datein öffnen
    		if((fp = fopen(filename,"wb+")) == NULL)     // Datein ausschließlich zum lesen öffnen!
    		{       
                // Fehler aufgetreten                                   
                system ("cls");
                printf("Fehler beim oeffnen der Datei '");
                printf(filename); printf("'\n");
    			while(!_kbhit());                      // warten auf tastendruck
    	        exit(1);                               // programm mit fehler beenden
            }
    
         // Werte zuweisen, damit bei der suchfunktion keine zufälligen ergebnisse entstehen
         eintrag.tag = 0;
         eintrag.monat=0;
         eintrag.jahr=0;
    
    // Nach richtigem Datum suchen!
       while ((eintrag.tag != tag) || eintrag.monat != monat || (eintrag.jahr != jahr))
    	   {         
           // Aus der Datei lesen:
    
           if (fread (&eintrag, sizeof(eintrag), 1, fp) < 1)
                break;    
    
    	   }
    	   z=ftell(fp);
    	   fclose(fp);
    
    	   // Datein zum schreiben öffnen
    		if((fp = fopen(filename,"rb+")) == NULL)     // Datein ausschließlich zum lesen öffnen!
    		{       
                // Fehler aufgetreten                                   
                system ("cls");
                printf("Fehler beim oeffnen der Datei '");
                printf(filename); printf("'\n");
    			while(!_kbhit());                      // warten auf tastendruck
    	        exit(1);                               // programm mit fehler beenden
            }
    
    		fseek(fp, z, SEEK_SET);
    
    // datei schließen
       if (fwrite (&neu, sizeof(eintrag), 1, fp) < 1)
        {
                   fclose(fp);
    			   printf ("Fehler beim Schreiben mit fwrite\n");
                   exit(1);
        }
       fclose(fp);
    
       printf("\n\nDas Bearbeiten war erfolgreich!\nBitte beliebige Taste druecken...\n");
       getch();
       return 1;
    }
    

    vielen dank schonmal

    gruessle
    fallen0ne



  • fopen öffnet immer am Anfang der Datei als mit Position 0 außer du öffnest im Append mode, da wird der filepointer ans Ende der datei positioniert.

    Daraus ergeben sich eine Lösungsmöglichkeit.
    Du merkst dir bevor du den nächsten Record liest die Position im File mit ftell
    liest den record. Wenn es der richtige ist positionierst du mit fseek den Filepointer an die gemerkte Stelle und schreibst einen: exact einen Record mit den neuen Daten

    Das sollte dein Problem beheben


Anmelden zum Antworten