Aus Datei lesen

enr00

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?

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);
}
 
Code:
s[B]n[/B]printf(dat, "%s%s\0", [B]MAX-1[/B], pfad, ".adres");
abgesehen davon

mit

Code:
 scanf("%s", temp);

wirds auch nix
als erstes amal niemals unbestimmt lange stirngs einlesen, wie wärs mit getline?

Wenns umbedingt so sein soll probier amal sowas

Code:
scanf("%[B](MAX-1)[/B]s", [B]&[/B]temp);

Wobei ich mir nicht sicher bin, ob er (MAX-1) so ohne weiteres frisst aber ich hab jetzt kein bock da herumzuspielen
 
als erstes amal niemals unbestimmt lange stirngs einlesen, wie wärs mit getline?
Hauptproblem ist, dass ich jede Zeile parsen muss.Datei ist folgednermassen aufgebaut:

Code:
vorname;nachname;16;person2; nachnameperson2;17;
Und diese Werte müssen einer verketteten Liste hinzugefügt werden.
 
Wenn du ca gleich große maximale namenlängen hast kannst du die eingabe beschränken, wenn nicht musst dus dynamisch verwalten, falls du noch eine gui und das ganze leicht portierbar machen willst kannst du dir ja auch mal die glib anschauen, die bietet iirc sogar einen typ string dabei musst du dich nicht drum kümmern was du machst.

Bzw getline allokiert auch ist aber nur für gcc verfügbar

oder probier vllt was auf diese art
Code:
int i=-5;
while(i+=5)
{
     fgets((char+(i*sizeof(char))), 5, DATEI);
     if(NULL!=strstr(*char, ";"))
     {
           break;
     }
     if(NULL==realloc(*char, (i+5)*sizeof(char)))
     {
          fprintf(stderr, "kein speicher, bum!\n");
          break;
     }
}
machirgendwas(*char);
free(*char);

das am besten in einer unterfunktion mit der übergabe eines *char und dann kann man das ganze schon anschauen, btw wenn du static variablen für die pointer verwendest kannst du sie bein nächsten unterprogrammaufruf weiterverwenden, ohne jedesmal den speicher neu anzulegen und wieder freizugeben.

Die herumspielerei mit sizeof(char) wirst du nicht brauchen, aber vergiss nicht, dass du für wide characters ich glaub int für charakters nehmen müsstest und wenn du gleich sizeof(*variable) nimmst kannst du da amal nicht einfachren, falls du auf unicode oä migrieren wolltest.
 
Zuletzt bearbeitet:

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

Aufgabe in C

USB Geräte per Bash Script resetten (Gerät hängt sich öfter mal auf)

Falsche Rechte gesetzt beim Anlegen von Ordnern via Samba-Client

NagiosGrapher 1.7.1 funktioniert nicht

Zurück
Oben