Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem: structs in datei ueberschreiben bzw. ersetzen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.06.2005, 22:52 Uhr
~Fallen0ne
Gast


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:

C++:
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

Dieser Post wurde am 22.06.2005 um 08:13 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.06.2005, 08:51 Uhr
ao

(Operator)



Zitat von ~Fallen0ne:


C++:
    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
        }




Das hier ist falsch. "w+" öffnet zum Schreiben und Lesen UND LÖSCHT gleichzeitig den vorhandenen Inhalt. D.h. nach dieser Aktion ist die Datei leer.

Ausschließlich zum Lesen nimmt man "r", zum Lesen und Schreiben ohne vorheriges Löschen "r+" oder "a+" - Letzteres vornehmlich zum Anhängen neuer Daten ans Ende der Datei.

Du kannst auch das doppelte Öffnen sparen und gleich mir "r+" öffnen, wenn du vor jedem Wechsel zwischen Lesen und Schreiben ein fseek oder fflush einfügst.

Lies mal in irgendeiner manpage oder in der MSDN-Hilfe genau nach, was da über fopen steht. Ist ein bisschen länglich, lohnt sich aber.

Das ist übrigens einer der Fälle, wo der Einsatz eines Debuggers sofort die entscheidenden Erkenntnisse geliefert hätte.

ao

Dieser Post wurde am 22.06.2005 um 08:52 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: