Datei öffnen mittels fopen !



  • Hallo, ich habe folgendes Problem, und würde mich freuen, wenn man mir dabei helfen könnte:

    Meine Aufgabe ist es, eine Adressverwaltung mit den Daten Nachname, Vorname... zu schreiben. Diese Daten lege ich in einer Struktur ab. Alle eingegebenen Adressen sollen später auf einer Datei(Text-Datei) auf der Festplatte abgespeichert werden. Auf diese Datei soll dann wiederum zugegriffen werden können. Das Abspeichern auf die Festplatte hat bei mir ohne Fehler funktioniert. Mein Problem ist es, die Datei wieder zum Lesen(z.B. um eine Adresse zu suchen) zu öffnen. Im folgenden liefere ich den entsprechenden Code.

    // Adresse speichern

    int adresseSp(struct ListEl **list,char datei[20])
    {
    FILE *fp;

    fp = fopen(datei, "a");

    if((fp = fopen(datei, "a")) == NULL)
    {
    printf("Fehler beim Erzeugen der Datei!");
    return 0;
    }

    if (*list == NULL)
    printf("Keine Adressen zum Abspeichern vorhanden!\n\n");

    else
    {

    fprintf(fp, "%s",((*list)->nachn));
    fprintf(fp, "\n");
    fprintf(fp, "%s",((*list)->vorn));
    fprintf(fp, "\n");
    fprintf(fp, "%s",((*list)->strasse));
    fprintf(fp, "\n");
    fprintf(fp, "%s",((*list)->postl));
    fprintf(fp, "\n");
    fprintf(fp, "%s",((*list)->ort));
    fprintf(fp, "\n");
    fprintf(fp, "%s",((*list)->feld));
    fprintf(fp, "\n");
    fprintf(fp, "\n");

    fclose(fp);
    }

    if(((*list)->next) != NULL)
    {return (adresseSp((&((*list)->next)),datei));
    }
    }

    // Datei öffnen (Funktioniert nicht)

    int adresseEin(struct ListEl **list,char datei[20])
    {
    FILE *fp;

    fp=fopen(datei, "r");
    if((fp = fopen(datei, "r")) == NULL)

    {
    printf("Fehler beim Oeffnen der Datei!\n\n");
    }

    else
    { //fgets(((*list)->nachn), x,fp);
    fscanf(fp,"%s",&((*list)->nachn));

    fclose(fp);
    }

    if(((*list)->next) != NULL)
    {
    return (adresseSp((&((*list)->next)),datei));
    }

    }

    Diese Funktionen werden dann in der main() Funktion folgendermaßen aufgerufen :

    // Adresse speichern

    printf(" Bitte geben Sie den Dateinamen an: ");
    scanf("%s", &datei);
    adresseSp(&first, datei);

    // Datei öffnen

    printf("Bitte geben Sie den Dateinamen an: ");
    scanf("%s", &datei);
    adresseEin(&first, datei);

    Warte auf Tipps , Danke schön !



  • die datei wird jeweils doppelt geöffnet - EINMAL REICHT!

    ich würde vorschlagen, du speicherst deine Daten binär ab - weniger aufwand

    funktion benötigt einen returnwert, auch wenn "list" leer ist.

    ist auf "first" genügend speicherplatz für das einlesen reserviert? (realloc, bzw. malloc!)

    du liest übrigends nur EINEN nachnamen ein!

    Verwende Code Tags:

    // Adresse speichern 
    
    int adresseSp(struct ListEl **list,char datei[20]) 
    { 
    FILE *fp; 
    
    if((fp = fopen(datei, "ab")) == NULL) 
    { 
       printf("Fehler beim anhaengen an die Datei!");  // ES WIRD ANGEHÄNGT!!!
       return 0; 
    } 
    
    if (*list == NULL) 
       printf("Keine Adressen zum Abspeichern vorhanden!\n"); 
    else 
    { 
       fwrite(*list,sizeof(ListEl),1,fp); // wozu überhaupt der doppelpointer? ^^
    // rekursivität ist NICHT gerade schnell und platzsparend
       fclose(fp); 
    } 
    
    if(((*list)->next) != NULL) 
    {
       return (adresseSp((&((*list)->next)),datei)); 
    } 
    } 
    
    // Datei laden (Funktioniert nicht) 
    
    int adresseEin(struct ListEl **list,char datei[20]) 
    { 
    FILE *fp; 
    
    if((fp = fopen(datei, "rb")) == NULL) 
    { 
       printf("Fehler beim Oeffnen der Datei!\n\n"); 
    } 
    
    else 
    { // speicher muss natürlich schon vorhanden sein
       fread(*list,sizeof(ListEl),1,fp); 
       fclose(fp); 
       // (*list)->next neu muss angepasst, und die funktion erneut aufgerufen werden,
    //um alle auszulesen (wäre mit einer schleife einfacher ;) )
    } 
    
    if(((*list)->next) != NULL) 
    { 
       return (adresseSp((&((*list)->next)),datei)); 
    } 
    
    return(0);
    } 
    
    //Diese Funktionen werden dann in der main() Funktion folgendermaßen aufgerufen : 
    // Adresse speichern 
    
    printf(" Bitte geben Sie den Dateinamen an: "); 
    fgets(datei,20,stdin); // 20 ist länge des feldes datei
    adresseSp(&first, datei); 
    
    // Datei öffnen 
    
    printf("Bitte geben Sie den Dateinamen an: "); 
    fgets(datei,20,stdin); // 20 ist länge des feldes datei
    adresseEin(&first, datei);
    

    mfg (c)h



  • Was steht denn alles in der struct ListEl drin ?

    Also welche Variablen ?



  • ... muss der UNREGISTRIERTE wissen... 🙄



  • Danke dir für deine Mühe !


Anmelden zum Antworten