Problem beim Auslesen und Schreiben von File
-
Hab folgendes Programm geschrieben, welches Personendaten aus der Datei "PERSONEN.DAT" ausliest. Mann kann nach einem Namen/Eintrag suchen (z.B. Stamm) und diesen anzeigen lassen. Soweit funktioneirt auch alles wunderbar...!
Jetzt kommt aber das Problem, dass der Eintrag geändert werden soll. Hierbei stürzt das Programm jedoch ab und ich habe echt keine Ahnung, warum...
Ich hoffe, ihr könnt mir helfen, das Problem zu lösen!Unter dem folgenden Link findet ihr die verwendeten Dateien:
http://mkellenberger.ch/Privat/Programmieren/PERSONEN.zipIch habe das ganze mit Dev C++ kompiliert.
-
Schreib doch mal den betreffenden Code ins Forum, DANKE!
-
#include <cstdio> #include <iostream> using namespace std; struct person { int alter; char vorname[20]; char nachname[20]; }; int programm(); void eingabe(struct person *pp); void einlesen(struct person *pp, FILE *); void ausgabe(struct person *pp); bool suchen(struct person *pp, short); void bearbeiten(struct person *pp); const short PERSONENZAHL = 4; int main() { programm(); return 0; getchar(); } int programm() { struct person personen[PERSONENZAHL]; FILE *input = fopen ("PERSONEN.DAT", "rw"); if (!input) { printf("Konnte PERSONEN.DAT nicht oeffnen!"); return 2; } for (short x = 0; x < PERSONENZAHL; x++) { einlesen(&personen[x], input); } while ( suchen(personen, PERSONENZAHL) ) ; // nichts machen } void eingabe (struct person *pp) { printf("\nBitte geben Sie die Daten zu einer Person ein!"); printf("\nVorname der Person: "); scanf ("%s", &pp->vorname); printf("\nNachname der Person: "); scanf("%s", &pp->nachname); printf("\nAlter der Person: "); scanf("%d", &pp->alter); } void einlesen (struct person *pp, FILE * file) { char zeile[100]; fgets(zeile, 100, file); zeile[strlen(zeile) - 1] = '\0'; strcpy(pp->vorname, zeile); fgets(zeile, 100, file); zeile[strlen(zeile) - 1] = '\0'; strcpy(pp->nachname, zeile); fgets(zeile, 100, file); zeile[strlen(zeile) - 1] = '\0'; pp->alter = atoi(zeile); } void ausgabe(struct person *pp) { printf("Vorname = %s", pp->vorname); printf("\nNachname = %s", pp->nachname); printf("\nAlter = %d", pp->alter); } bool suchen(struct person *personen, short anzahl) { bool gefunden = false; printf("Geben Sie den Namen der gesuchten Person ein (exit beendet): "); char suchname[20]; scanf("%s", &suchname); if (strcmp(suchname, "exit") == 0) return false; // fertig, beenden for (short index = 0; index < anzahl; index++) { if (strcmp(personen[index].nachname, suchname) == 0) { gefunden = true; ausgabe(&personen[index]); bearbeiten(&personen[index]); } } if (!gefunden) printf("\nPerson mit diesem Namen existiert nicht!"); return true; // weitersuchen } void bearbeiten(struct person *pp) { short wahl; do { printf("\nWollen Sie die Daten dieser Person bearbeiten? 0=nein, 1=ja: "); scanf("%d", &wahl); } while (wahl < 0 || wahl > 1); if (wahl == 1) eingabe(pp); }
Die .DAT - Datei ist folgendermassen aufgebaut:
[Vorname]
[Name]
[Alter]
[Vorname]
[Name]
[Alter]
[Vorname]
[Name]
[Alter]
...
-
Bist du in der Lage, die fehlerhafte Stelle einzugrenzen, ohne dass hier jeder den ganzen Code analysieren muss?
Zeh Mau
-
Hab da schon etliche male debugged und bin eigentlich immer an folgender Stelle hängengeblieben:
void einlesen (struct person *pp, FILE * file) { char zeile[100]; fgets(zeile, 100, file); zeile[strlen(zeile) - 1] = '\0'; strcpy(pp->vorname, zeile); fgets(zeile, 100, file); zeile[strlen(zeile) - 1] = '\0'; strcpy(pp->nachname, zeile); fgets(zeile, 100, file); zeile[strlen(zeile) - 1] = '\0'; pp->alter = atoi(zeile); }
Genauer gesagt bei der Zeile:
pp->alter = atoi(zeile);
-
damit du atoi verwenden kannst, musst du die Bibliothek stdlib.h einbinden!
-
Edit:
....wenn du ein reines C-Programm schreibst. Denn "using namespace" ist imo ein reines C++-Konstrukt..
-
Hab die Biblithek jetzt so eingebunden:
#include <stdlib.h>
Den Rest des Codes habe ich so belassen, wie er war...
Es funktioniert immer noch nicht. Langsam fange ich an zu verzweifeln...
Das Programm stürzt ab und ic hab nicht mal ne schlaue Fehlermeldung...
-
Das müsste für c++ so bei dir sein:
#include <cstdlib>
Was mich wundert:
Wieso ist in main ein return und dann kommt ein getchar()?
Das macht keinen Sinn.In der Funktion einlesen brauchst du nicht die abschließende NULL
zu setzen, dass macht schon die Funktion fgets für dich.Ausserdem setzt du den Index in deinem Beispiel falsch!
Wenn strlen von "HAUS" 4 liefert würde array[4-1] genau das S überschreiben!
Suchen wird solange aufgerufen, solange while true ist.
Kann es sein, dass der Offset des Dateizeigers nicht richtig gesetzt wird.Zeh Mau