Übung zum binärem Schreiben
-
Wieviel Termine kannst du denn verwalten?
-
Das ist ne gute Frage keine Ahnung... wurde nicht bekannt gegeben.
der lehrer hat auch erwähnt: die Gesamtebyteanzahl des files dividieren durch die Byteanzahl der Struktur = Anzahl der Termine...
und dann kann man da: pointer=malloc(sizeof(struct)*anzahl) schreiben..
Aber wie soll man den das genau machen?
Der aktuelle code ist:
h-file: #ifndef _termine_h_ #define _termine_h_ #define MAX_STRLEN 40 struct tdatum_struct { int datum; float uhrzeit; }; typedef struct tdatum_struct tdatum; struct termine_struct { char thema[MAX_STRLEN]; tdatum von; tdatum bis; char teilnehmer[MAX_STRLEN]; char prioritaet[MAX_STRLEN]; char beschreibung[MAX_STRLEN]; char status[MAX_STRLEN]; }; typedef struct termine_struct termine; void eingabe(char filename); void ausgabe_termin(char filename); #endif 1.c-file: #include <stdio.h> #include "termine.h" #include <string.h> void eingabe(char filename[],int anz) { FILE *outfile=NULL; //termine *terminPointer=NULL; termine temp; fflush(stdin); printf("Thema des Termins:\n"); gets(temp.thema); printf("Termin von:\n"); printf("Datum(TTMMJJ):\n"); scanf("%d",&temp.von.datum); fflush(stdin); printf("Uhrzeit(HH.MM):\n"); scanf("%f",&temp.von.uhrzeit); fflush(stdin); printf("Termin bis:\n"); printf("Datum(TTMMJJ):\n"); scanf("%d",&temp.bis.datum); fflush(stdin); printf("Uhrzeit(HH.MM):\n"); scanf("%f",&temp.bis.uhrzeit); fflush(stdin); printf("Teilnehmer:\n"); gets(temp.teilnehmer); printf("Prioritaet des Termins(HOCH, MITTEL, NIEDRIG):\n"); gets(temp.prioritaet); printf("Beschreibung des Termins:\n"); gets(temp.beschreibung); strcpy(temp.status,"OFFEN"); printf("\n"); printf("\n"); outfile=fopen(filename,"ab"); if (outfile != NULL) { if (1 != fwrite(&temp,sizeof(termine),1,outfile)) { printf("error during write of 1 blocks!\n"); } //fwrite(terminPointer,sizeof(termine),1,outfile); fclose(outfile); } else { printf("cannot write file %s!",filename); } } void ausgabe_termin(char filename[]) { FILE*infile=NULL; termine terminPointer; tdatum temp = {0,0.0}; int anz=0; printf("Geben Sie das Datum des suchenden Termins ein: "); scanf("%d",&temp.datum); infile = fopen(filename,"rb"); while(!feof(infile)) { fread(&terminPointer,sizeof(termine),1,infile); if(terminPointer.von.datum == temp.datum) { printf("%s\n%s\n",terminPointer.thema,terminPointer.beschreibung); printf("Von %d um %d Uhr ",terminPointer.von.datum,terminPointer.von.uhrzeit); printf("bis %d um %d Uhr \n",terminPointer.bis.datum,terminPointer.bis.uhrzeit); printf("Teilnehmer: %d\n",terminPointer.teilnehmer); printf("Prioritaet: %s\n",terminPointer.prioritaet); printf("Status: %s\n\n",terminPointer.status); } } fclose(infile); } 2. c-file(main): #include<stdio.h> #include "termine.h" void main() { char filename[MAX_STRLEN]="daten.dat"; int x=0; printf("Geben Sie 1 ein um einen Termin einzugeben.\n"); printf("Geben Sie 2 ein um einen Termin auszugeben.\n"); printf("Geben Sie 3 ein um die ganze Terminliste auszugeben.\n"); printf("Geben Sie 4 ein um einen Termin zu loeschen.\n"); printf("Geben Sie 5 ein um einen Termin anzufuegen.\n"); printf("\n"); printf("Auswahl:"); scanf("%d",&x); switch(x) { case 1: eingabe(filename); break; case 2: ausgabe_termin(filename); break; case 3: break; case 4: break; case 5: break; default: printf("Fehler beim Eingeben!\n"); break; } }
-
Oder habt ihr gerade verkettete Listen im Plan?
-
Nein, sowas haben wir nocht nicht gelernt.
Nochmal die Aufgabenstellung:
-
Hab was vergessen:
* Kurzbeschreibung : Programm zum Ueben von dynamischer Speicherverwaltung, binaeren FileIO.
* Implementierung zum Test von malloc free
* Ueben von modularem Programmieren und ueben von Strukturen mit Pointern.
-
Ja und jetzt muss ich halt die ganzen Termine im binär file auslesen mit fread und so bzw. dann halt malloc verwenden, aber nur wie? hat einer ein paar Tipps bitte?
-
Arbeite erst mal alle dir hier gegebenen Tipps ab, bereinige dadurch deine Fehler und dann hilft dir hier vielleicht doch noch jemand weiter.
-
Jo danke, ich habs jetzt soweit hinbekommen jetzt muss ich nur noch einen Termin aus dem binär file löschen.
Ich hab folgende Idee: ich lese aus dem binär file aus, gebe das Thema & Datum des Termins ein der gelöscht werden soll, such den dann wenn ich die position gefunden habe vom Termin dann überschreibe ich diesen Termin mit dem nächsten usw.
Also ich hab 5 Termine und der 3. soll gelöscht werden...
12345 --> der 4. termin wird uaf position 3 geschrieben und der 5. auf 4 -> 1245
Soll ich das so machen?
Aber was ist wenn ich den 5. Termin löschen müsste? Wer überschreibt den dann?
-
Keiner.
-
Ja ok, was hälst du von meiner Idee bzw. wie löse ich das mit dem letzten Termin weis das einer bitte?
-
Dann ist deine Datei nach dem 4. Eintrag zu Ende.
-
Danke!
Aber ich bekomms leider nicht hin. Kann mir wer bitte Tipps geben wie ich es machen kann?
Und ja und free braucht den 1. Wert wo der Pointer draufzeigt, den man allokiert..., hab ich nicht gemacht, aber das ist egal ist nebensache. Hauptprolem ist jetzt wie ich den Termin löschen soll
Hier das was ich bis jetzt habe:
void termin_löschen(char filename[]) { FILE* outFile=NULL; FILE* inFile=NULL; termine* termindata=NULL; termine* hilf=NULL; termine thema; int anz=0; anz=file_len(filename); termindata=malloc(sizeof(termine)*anz); if(termindata != NULL) { outFile=fopen(filename,"rb"); if(outFile == NULL) { printf("The files %s could not be opened",filename); exit(-1); } fread(termindata,sizeof(termine),anz,outFile); fclose(outFile); inFile=fopen(filename,"wb"); if(inFile == NULL) { printf("The file %s could not be opened!"); exit(-1); } printf("Geben Sie das Thema des Termins ein, der geloescht werden soll:") scanf("%s",thema.thema); for(x=0; x<anz; x++) { if(thema.thema == termindata->thema) { (termindata+x)->beschreibung=termindata->beschreibung // weis nicht ob das stimmt... außerdem gehört das dann wieder in eine schleife das es die ganzen termine nach vorschiebt irgendwie. Ich hab keine Ahnung } termindata++; } free(termindata); } else { printf("Memory allocation failure!"); } }
-
So ich habs nun probiert, zwar nicht mit schieben, dafür anders:
Das Problem dabe ist, das die if-anweisung zum überprüfen ob das thema ungleich ist mit dem eingegeben thema vollkommen ignoriert wird und ich weis leider nicht warum.
void termin_löschen(char filename[]) { FILE* outFile=NULL; FILE* inFile=NULL; termine* termindata = NULL; termine* hilf = NULL; char thema[100]; int x=0; int anz=0; anz=file_len(filename); fflush(stdin); printf("Geben Sie das Thema des Termins ein, der geloescht werden soll:"); gets(thema); termindata=(termine *)malloc(sizeof(termine)* anz); if(termindata != NULL) { hilf=termindata; outFile=fopen(filename,"rb"); if(outFile == NULL) { printf("The file %s could not be opened",filename); } fread(termindata,sizeof(termine),anz,outFile); fclose(outFile); inFile=fopen(filename,"wb"); if(inFile == NULL) { printf("The file %s could not be opened",filename); } for(x=0; x<anz; x++) { if(thema != termindata->thema)// <-- wird ignoriert { fwrite(termindata,sizeof(termine),1,inFile); } termindata++; } fclose(inFile); } else { printf("Memory allocation failure!"); } free(hilf); }
-
Die Vergleiche != und == und die mit < > funktionieren nicht bei Arrays.
-
Ah^^, ok danke dir
--> strcmp