-
29.01.12 15:26 #16
- Registriert seit
- Jun 2011
- Beiträge
- 76
Mh ok, ich habs nur so geschrieben da es beim Visual c++ 2008 auch so steht, aber ok egal.
Ok, hier hab ich einfach den 1. Wert wo "daten" daraufzeigt in daten1 zwischengespeichert, denn man muss ja ab den 1. Wert wo der Zeiger draufzeigt freigeben.write_termin:
Du allokierst etwas für daten, in daten1 ist derweil NULL.
Dann überschreibst du daten mit daten1.
Ergebnis: Beide sind NULL.
Dann verwendest du daten...
Vllt. solltest du sinnvollere Variablennamen geben?
Und daten1 zeigt ja sowieso auf die gleichen Adresssen wie daten, denn es gibt ja nur ein "Reihe von Adressen" oder?
Zum scanf: scanf brauch ich eigentlich gar nicht da ich ja leerzeichen mit einlesen will...
Darum gets, aber dann kommt halt, die im Bild beschriebene Fehlermeldung.
-
Was in VS steht bedeutet, dass du das Programm nicht über den Debugger startest.
Kompiliert ist es aber dafür, sonst kommt nicht so eine Meldung.
Zum Rest: Keine Ahnung, was du da meinst.
Ich bleib dabei, dass du Unsinn mit deinen Pointern machst.
Beispiel
Was steht jetzt in a und b?Code cpp:1 2 3 4 5
int a = 0; int b = 0; a = 123; a = b;
0 und 0.
Zu "eine Reihe von Adresse":
Nö. Speicherverwaltung von Windows/Linux macht da nicht mit.
Mach ein Programm, das eine Zahl in ein int einliest
und dann Zahl und Adresse davon ausgibt.
Starte dieses Programm zweimal und gib verschiedene Zahlen ein.
Die ausgegeben Zahlen sind bei jedem Programm anders,
die Adresse wird aber gleich sein.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
29.01.12 16:31 #18
- Registriert seit
- Jun 2011
- Beiträge
- 76
Ah ok, verstehe danke.
Ich hab nun die Zuweisung von daten und daten1 vertauscht jetzt kann man eingeben nur Problem ist... das 1. gets wird übersprungen warum?
Hättest du eine Idee wie ich die "Speicherstellen" im string so begrenze kann, dass ich im notpad++, wenn ich die .dat datei öffne nicht mehr die komischen I's sehe?
-
gets sind jetzt also wieder entkommentiert?
Bitte aktuellen Code.
Zu den Zeichen in Notepad:
So arbeiten fwrite/fread nun mal.
Einen Byteblock fixer Länge schreiben. Wenn der String nicht voll ist,
wird der Rest auch geschrieben.
Du könntest die Stringlänge als int vor dem String reinschreiben,
dann eben nur den tatsächlichen Inhalt,
und beim Auslesen über die Stringlänge eben feststellen,
wie viel gelesen werden muss.
Ganze struct in einem Befehl geht dann aber nicht mehr.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
29.01.12 17:08 #20
- Registriert seit
- Jun 2011
- Beiträge
- 76
Ok, aktueller Code hier(mit gets, jup, aber das 1. gets wird irgendwie ignoriert und in topic einfach nichts drinnen, aber wenn cih am anfang 2 termine eingebe und beim 2. durchlauf also beim 2. termin da kann ich jetzt das topic eingeben):
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
1. c-file(main): #include "write_termin.h" #include "w_binaer_file.h" #include <stdio.h> void main() { char filename[MAX_LEN]="daten.dat"; terminData* daten=NULL; int anz=0; printf("Geben Sie bitte die Anzahl Ihrer Termine ein:"); scanf("%d",&anz); daten=write_termin(filename,anz); write_binaer_file(filename,daten,anz); free(daten); } 2. c-file: #include "write_termin.h" #include <stdio.h> terminData* write_termin(char filename[], int anz) { terminData* daten=NULL; terminData* daten1=NULL; int n=0; daten=(terminData*)malloc(sizeof(terminData)* anz); if(daten != NULL) { daten1=daten; while(n<anz) { printf("Thema des Termins:\n"); gets(daten1->topic);// hier "überspringt" er printf("Anfangsdatum des Termins:\n"); gets(daten1->start_date); printf("Enddatum des Termins:\n"); gets(daten1->end_date); printf("Wer nimmt teil?\n"); gets(daten1->user); printf("Priorität des Termins(HOCH, MITTEL, NIEDRIG:\n"); gets(daten1->priorität); printf("Beschreibung des Termins:\n"); gets(daten1->description); printf("Status des Termins(ERLEDIGT, OFFEN):\n"); gets(daten1->start_date); n++; daten1++; } } else { printf("Memory allocation Failure!"); } return(daten); } 3. c-file: #include "write_termin.h" #include "w_binaer_file.h" #include <stdio.h> void write_binaer_file(char filename[],terminData* termindaten, int anz) { FILE* outFile=NULL; outFile=fopen(filename,"wb"); if(outFile != NULL) { if(anz != fwrite(termindaten,sizeof(terminData),anz,outFile)) { printf("error during write of %d blocks",anz); } } else { printf("File %s could not be opened",filename); } fclose(outFile); } 1. h-file: #ifndef _write_termin_h_ #define _write_termin_h_ 1 #define MAX_LEN 100 struct struct_termin { char topic[MAX_LEN]; char start_date[MAX_LEN]; char end_date[MAX_LEN]; char user[MAX_LEN]; char priorität[MAX_LEN]; char description[MAX_LEN]; char state[MAX_LEN]; }; typedef struct struct_termin terminData; terminData* write_termin(char filename[], int anz); #endif 2. h-file: #include "write_termin.h" #ifndef _wbinaer_file_h_ #define _wbinaer_file_h_ 1 void write_binaer_file(char filename[],terminData* termindaten, int anz); #endif
Geändert von Googlehupf (29.01.12 um 17:11 Uhr)
-
Das ist, weil sich scanf und gets nicht vertragen.
Nimm die Funktion dazu:
und schreib statt dem scanf für anz im main das:Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
int File::readint() { int i; char buffer[20]; if(NULL == fgets(buffer, 20, stdin)) return -1; i = strlen(buffer) - 1; if(i >= 0 && buffer[i] == '\n') buffer[i] = '\0'; else { while(fgetc(stdin) != '\n'); } if(1 != sscanf(buffer, "%d", &i)) return -1; return i; }
Code cpp:1
anz = readint();
GrußNetiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
05.02.12 12:42 #22
- Registriert seit
- Jun 2011
- Beiträge
- 76
Danke!
Ich hab jetzt alle Aufgaben erfüllt bis auf das Löschen eines Termins.
Folgendes hab ich mir gedacht:
Ich lese aus dem binär file aus, gebe das Thema 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 auf position 3 geschrieben und der 5. Termin auf Position 4 -> 1245
Was ist dann mit der 5. Position da bleibt doch eine Kopie vom 5. Termin erhalten oder?
Ein Problem tritt auch auf, wenn ich den 5. Termin löschen will wie mache ich das? Da kann ich ja nichts überscheiben oder?
Hier mein Versuch:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
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);//hier wird die Anzahl der Termine die im File stehn ermittelt --> anz=Anzahl der Termine termindata=(termine *)malloc(sizeof(termine)*anz); if(termindata != NULL) { hilf=termindata; 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) { //hier werden halt die ganzen Termine verschoben bzw. eine Schleife ist auch noch notwendig, aber ich kanns einfach nicht umsetzen... } termindata++; } free(hilf); } else { printf("Memory allocation failure!"); } }
-
05.02.12 12:54 #23
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Du solltest einfach die Termine aus der Datei in den Speicher laden.
Manipuliere die Termine im Speicher und schreibe die Termine komplett neu in die Datei (alte Datei überschreiben).
\edit: Eine Liste würde sich für die Verwaltung der Termine im Speicher vermutlich am besten eignen. Zumal es eine ziemlich simple Datenstruktur ist.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Hi
zuerst was Anderes: Bei deiner Löschfunktion musst du nach
Einlesen und Löschen die Datei auch wieder beschreiben.
Sonst ists ja sinnlos, wenn der zu löschende Termin in der Datei noch existiert.
Zum Löschen selber: Du denkst richtig.
Aus einem Array "gelöscht" wird, in dem man alles
nach dem betroffenen Element eins nach vorne verschiebt/kopiert.
Dass es vom Letzten dann zwei gibt ist auch richtig, aber:
Ignorier das Gesamt-Letzte einfach.
Du liest 5 Elemente ein, 12345
Du löscht 3, ergib 12455.
Du weißt aber, dass es jetzt nur noch 4 Elemente sind,
und schreibst nur 4 wieder in die Datei.
1245.
Zum Löschen des Letzten:
Geht eigentlich genau so, es gibt dahinter nur nichts,
das verschoben/kopiert werden kann.
Da man das Verschieben in einer Schleife macht, von x bis Ende,
und Ende dann eben sofort ist, braucht es keine Sonderbehandlung.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
05.02.12 14:51 #25
- Registriert seit
- Jun 2011
- Beiträge
- 76
Danke, ich habs nun aber ein bisschen anders probiert, weil ich das mit dem schieben nicht wirklich hinbekommen habe.
Ich geb ein Thema ein z.B. "lernen", die if-anweisung wird voll ignoriert warum?
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
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) { fwrite(termindata,sizeof(termine),1,inFile); } termindata++; } fclose(inFile); } else { printf("Memory allocation failure!"); } free(hilf); }
Geändert von Googlehupf (05.02.12 um 14:55 Uhr)
-
So, mit dem Sofort-Schreiben, gehts natürlich auch.
Der Fehler: char-Array-Strings werden mit strcmp verglichen.
Du vergleichst da, ob es die selben Strings sind
(nicht nur der gleiche Inhalt, sondern wirklich ein- und derselbe String).
Zum Inhaltsvergleich:
Code cpp:1
if(strcmp(thema, termindata->thema))
Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
25.02.12 20:22 #27
- Registriert seit
- Jun 2011
- Beiträge
- 76
Die Aufgabe ist das man einen bestimmten Termin suchen muss im Binärfile und dann auslesen.
Meine Idee: Ich geben vorher das Datum ein und dann vergleiche ich das Datum mit den Datums im Binärfile wenn die gleich sind speichere ich sie in eine Adresse wo ein Pointer draufzeigt, da es ja mehrere Termine an einem Tag geben kann. Problem ist nur das ich 2mal fast den selben Vorgang mache und das ist nicht gut.
Hier mal der Ausschnitt:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
termin* termin_search(char filename[]) { FILE* outFile=NULL; termin temp; timestamp dat_von; termin* term_gesucht=NULL; int anz=0; outFile=fopen(filename,"r+b"); if(outFile == NULL) { printf("File %s could not be opened!",filename); exit(-1); } printf("Geben Sie das Datum des/der gesuchten Termin(e) ein(TTMMJJ):"); scanf("%d",dat_von.tag); scanf("%d",dat_von.mon); scanf("%d",dat_von.jahr); while(!feof(outFile)) { fread(&temp,sizeof(termin),1,outFile); if(temp.von.tag == dat_von.tag && temp.von.mon == dat_von.mon && temp.von.jahr == dat_von.jahr) { anz++; } } rewind(outFile); term_gesucht=malloc(sizeof(termin)*anz); while(!feof(outFile)) { fread(&temp,sizeof(termin),1,outFile); if(temp.von.tag == dat_von.tag && temp.von.mon == dat_von.mon && temp.von.jahr == dat_von.jahr) { //hier käme dann das lange zuweisen, aber das dauert ja ewig zum schreiben^^ } } return(term_gesucht); }
Hier die lange Struktur:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
struct timestamp_struct { short jahr; short mon; short tag; int min; }; typedef struct timestamp_struct timestamp; struct termin_struct { char thema[MAX_THEMALEN]; timestamp von; timestamp bis; char teilnehmer[MAX_TEILNEHMER]; short priority; char beschreibung[MAX_BESCHR]; short status; }; typedef struct termin_struct termin;
Natürlich könnte ich die gesuchten Termine auch gleich im Unterprogramm ausgeben, aber zum Ausgeben habe ich eine weitere Funktion, die ich dann im Hauptprogramm aufrufen werde.
Diese sieht so aus:
Code cpp:1 2 3 4 5 6
void termin_out(termin termin_zur_ausgabe) { printf("------------------\n"); printf("Termin: %s \nTeilnehmer %s \nprio %d \nBeschreibung: %s \nStatus %d\n",termin_zur_ausgabe.thema,termin_zur_ausgabe.teilnehmer,termin_zur_ausgabe.priority,termin_zur_ausgabe.beschreibung,termin_zur_ausgabe.status); printf("------------------\n"); }
-
Du kannst die Ausgebe-Funktion doch auch aus dem "Unterprogramm" aufrufen.
main ist nicht die einzige Stelle, wo man FUnktionen aufufen kann.
Das kann ziemlich verschachtelt werden.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
25.02.12 23:01 #29
- Registriert seit
- Jun 2011
- Beiträge
- 76
Ok, danke aber ich kann trotzdem nicht die 2 gleichen schleifen umgehn. Wenn ich mit Pointer mach muss ich ja die anz wissen für malloc und wenn i mit Array mache dann muss ich auch irgendwie Größe wissen, da ich kann ja net einfach 100 elemente definieren oder so. Ja klar kann ich das aber ist doof irgendwie. Ist wie beim malloc einfach schreiben sizeof(termin)*100 oder?
-
Die Gesamtanzahl der Termine muss vorher bekannt sein.
Wenn du 100 nehmen würdest, wäre es ja trotzdem möglich,
101 Ergebnisse reinspeichern zu müssen...
Also, wenn nicht im Programm vorher schon gemacht, abzählen.
Bitte Netiquette 15 beachten.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
Ähnliche Themen
-
Auslesen von Datei ... fread
Von crsakawolf im Forum C/C++Antworten: 3Letzter Beitrag: 27.04.09, 16:18 -
Datei binär einlesen
Von Bastih84 im Forum C/C++Antworten: 16Letzter Beitrag: 27.04.05, 21:24 -
einlesen und ausgeben in binär
Von F_P_aus_K im Forum .NET ArchivAntworten: 0Letzter Beitrag: 08.11.04, 13:32 -
[C] Probleme mit fwrite & fread
Von Yupa im Forum C/C++Antworten: 4Letzter Beitrag: 14.03.04, 12:01 -
Wie funktioniert fread/fwrite
Von Bennily im Forum C/C++Antworten: 3Letzter Beitrag: 13.03.04, 19:04



16Danke


Zitieren

Login






