enr00
Routinier
Dies sind die Teile meines Adressen-Verwaltungs-progs, die aus einer Datei laden, und darin speichern. Das mit dem Auslesen gelingt mir jedoch nicht so richtig, kann mir da jemand helfen?
und hier der vollständige Code:
Code:
void save(const char *pfad)
{
ADRES *temp = anfang;
FILE *datei;
char dat[MAX];
sprintf(dat, "%s%s", pfad, ".adres");
datei = fopen(dat, "w");
if(datei == NULL)
fehler("Konnte Datei nicht öffnen.");
if(temp == NULL)
{
fprintf(stdout, "Noch kein Datensatz vorhanden.\n\n");
return;
}
while(temp != NULL)
{
fprintf(datei, "%s;%s;%d;", temp->vname, temp->nname, temp->alter);
temp = temp->next;
}
fprintf(datei, "%c", '?');
fclose(datei);
}
void load(const char *pfad)
{
ADRES *temp = anfang;
FILE *datei;
char dat[MAX], vname[20], nname[20], puffer[MAX], c;
int alter;
sprintf(dat, "%s%s", pfad, ".adres");
datei = fopen(dat, "r");
if(datei == NULL)
fehler("Konnte Datei nicht öffnen.");
if(temp == NULL)
{
anfang = temp = (ADRES *)malloc(sizeof(ADRES));
temp->next = NULL;
}
while((c = fgetc(datei)) != EOF)
{
fscanf(datei, "%s;%s;%d;", vname, nname, &alter);
if(*vname != '?')
{
anhangen(vname, nname, alter);
temp = temp->next;
}
}
fclose(datei);
}
und hier der vollständige Code:
Code:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
struct adres
{
char vname[20];
char nname[20];
char alter;
struct adres *next;
};
typedef struct adres ADRES;
ADRES *anfang = NULL;
void fehler(const char *fehler);
void anhangen(char *vname, char *nname, char alter);
void alles_ausgeben();
void eingabe();
void suche(const char *wen);
void del(const char *wen);
void ciao(const char *von);
void save(const char *pfad);
void load(const char *pfad);
int main(int argc, char *argv[])
{
unsigned char auswahl;
char temp[MAX];
do
{
printf("1 Eingabe\n");
printf("2 Alles ausgeben\n");
printf("3 Nach Vornamen suchen\n");
printf("4 Nach Vornamen loeschen\n");
printf("5 In Datei speichern\n");
printf("6 Aus Datei laden\n");
printf("\n100 Beenden\n");
scanf("%d", &auswahl);
switch(auswahl)
{
case 1: eingabe();
break;
case 2: alles_ausgeben();
break;
case 3: printf("Nach welchem Vornamen wollen sie suchen?");
scanf("%s", temp);
suche(temp);
break;
case 4: printf("Elemente mit welchem Vornamen wollen sie löschen...");
scanf("%s", temp);
del(temp);
break;
case 5: printf("In welche Datei soll gespeichert werden?");
scanf("%s", temp);
save(temp);
break;
case 6: printf("Aus welcher Datei soll gelesen werden?");
scanf("%s", temp);
load(temp);
break;
case 100: ciao("Christophe");
return 0;
break;
default: printf("Ungültige Auswahl, bitte neue Auswahl treffen...");
scanf("%d", &auswahl);
break;
}
}while(auswahl != 100);
return 0;
}
void fehler(const char *fehler)
{
fprintf(stderr, "Fehler: %s\n", fehler);
}
void anhangen(char *vname, char *nname, char alter)
{
char nn[20], vn[20];
ADRES *temp;
strcpy(nn, nname);
strcpy(vn, vname);
if(anfang == NULL)
{
anfang = (ADRES *)malloc(sizeof(ADRES));
anfang->next = NULL;
}
else
{
while(temp->next != NULL)
{
temp = temp->next;
}
temp->next = (ADRES *)malloc(sizeof(ADRES));
temp = temp->next;
}
temp->alter = alter;
strcpy(temp->vname, vn);
strcpy(temp->nname, nn);
}
void alles_ausgeben()
{
ADRES *temp;
temp = anfang;
if(anfang == NULL)
{
fprintf(stdout, "Noch kein Datensatz vorhanden.\n\n");
}
while(temp != NULL)
{
printf("Name: %s\nVorname: %s\nAlter: %d\n\n", temp->vname, temp->nname, temp->alter);
temp = temp->next;
}
}
void eingabe()
{
ADRES *temp;
temp = anfang;
int alter;
char vn[20], nn[20];
if(anfang == NULL)
{
temp = (ADRES *)malloc(sizeof(ADRES));
temp->next == NULL;
anfang = temp;
}
else
{
while(temp->next != NULL)
temp = temp->next;
temp->next = (ADRES *)malloc(sizeof(ADRES));
if(temp->next == NULL)
fehler("Fehler beim reservieren des Speicherplatzes für temp->next.");
temp = temp->next;
}
printf("Bitte Vornamen eingeben...");
scanf("%s", vn);
printf("Bitte Nachnamen eingeben...");
scanf("%s", nn);
printf("Bitte Alter eingeben:...");
scanf("%d", &alter);
printf("\n\n");
strcpy(temp->nname, nn);
strcpy(temp->vname, vn);
temp->alter = alter;
temp->next = NULL;
}
void suche (const char *wen)
{
ADRES *temp;
int gefunden = 0;
temp = anfang;
while(temp != NULL)
{
if((strcmp(wen, temp->vname)) == 0)
{
printf("Name: %s\nVorname: %s\nAlter: %d\n\n", temp->vname, temp->nname, temp->alter);
gefunden = 1;
}
temp = temp->next;
}
if(gefunden == 0)
printf("Vorname %s nicht gefunden.\n\n", wen);
}
void del(const char *wen)
{
ADRES *temp = NULL;
ADRES *zeiger_delete = NULL;
ADRES *zeiger_vor = NULL, *zeiger_nach = NULL;
int gefunden = 0;
temp = anfang;
if(temp->next == NULL && strcmp(wen, temp->vname) == 0)
{
free(temp);
temp = anfang = NULL;
}
while(temp != NULL)
{
if(strcmp(wen, temp->next->vname) == 0)
{
zeiger_delete = temp->next;
temp->next = zeiger_delete->next;
free(zeiger_delete);
gefunden = 1;
}
temp = temp->next;
}
zeiger_delete = temp = NULL;
if(gefunden == 1)
printf("Vorname %s nicht gefunden.\n", wen);
}
void ciao(const char *von)
{
printf("\n\n\nCIAO\n\n\n by %s\n\n\n", von);
}
void save(const char *pfad)
{
ADRES *temp = anfang;
FILE *datei;
char dat[MAX];
sprintf(dat, "%s%s", pfad, ".adres");
datei = fopen(dat, "w");
if(datei == NULL)
fehler("Konnte Datei nicht öffnen.");
if(temp == NULL)
{
fprintf(stdout, "Noch kein Datensatz vorhanden.\n\n");
return;
}
while(temp != NULL)
{
fprintf(datei, "%s;%s;%d;", temp->vname, temp->nname, temp->alter);
temp = temp->next;
}
fprintf(datei, "%c", '?');
fclose(datei);
}
void load(const char *pfad)
{
ADRES *temp = anfang;
FILE *datei;
char dat[MAX], vname[20], nname[20], puffer[MAX], c;
int alter;
sprintf(dat, "%s%s", pfad, ".adres");
datei = fopen(dat, "r");
if(datei == NULL)
fehler("Konnte Datei nicht öffnen.");
if(temp == NULL)
{
anfang = temp = (ADRES *)malloc(sizeof(ADRES));
temp->next = NULL;
}
while((c = fgetc(datei)) != EOF)
{
fscanf(datei, "%s;%s;%d;", vname, nname, &alter);
if(*vname != '?')
{
anhangen(vname, nname, alter);
temp = temp->next;
}
}
fclose(datei);
}