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. |