Einlesen aus ein .txt mit fscanf



  • Hi zusammen,
    hab da ein Problem beim Einlesen mehrerer Addressen aus "addresse.txt".
    Steht in diese Datei zB"Anna Muller Bernd Schuster Hans Meier Franz Josef"
    werden zwar 4 Namen einglesen aber der Name ist dann 4x Anna Mueller.
    Hab das nach folgende Programm soweit wie möglich gekürzt.
    Hoffe ihr könnt was damit anfangen, bzw mir helfen.
    Schon mal danke. :xmas1:
    Problem steckt in der Funktion fscanfaddresse bzw am Anfang von main.
    [/cpp]
    #include <stdio.h>
    #include <string.h>

    #define arrs 9

    typedef struct daten
    { char name[20];
    char vorname[20];
    }Daten;
    void printaddresse(const Daten *pdaten)
    {
    printf("Name und Vorname: %s %s\n",pdaten->name, pdaten->vorname);
    }
    void fscanfaddresse(const Daten *pdaten)
    {
    Daten addresse;
    FILE *datei;
    int index = 0;
    datei = fopen("addresse.txt","r");
    fseek(datei, 0, SEEK_CUR);
    fscanf (datei, "%s\n", pdaten->name);
    fscanf (datei, "%s\n", pdaten->vorname);
    fclose (datei);
    }
    void scanfaddresse(const Daten *pdaten)
    {
    printf("Vorname: \n");
    scanf ("%31s", pdaten->vorname);
    fflush(stdin);
    printf("Name: \n");
    scanf ("%31s", pdaten->name);
    fflush(stdin);
    }
    int main (void)
    {
    int addzaehler = 0, addaus = 0, i, loesch, eingelesen, k=1;
    char answer, help;
    Daten *addresse;
    FILE *datei;

    datei = fopen("addresse.txt","r");
    while(1)
    {
    if(eingelesen = fscanf(datei, "%s", &help) == EOF)
    {
    break;
    }
    else
    {
    while (eingelesen = fscanf(datei, "%s", &help) != EOF)
    {
    fscanfaddresse(&addresse[addzaehler++]);
    break;
    }
    }
    }
    while (1)
    {
    if((addzaehler >= 0) && (addzaehler < arrs))
    {
    printf("\nMoechten Sie eine neue Addresse eingeben?\n"
    "Dann druecken Sie <E>\n"
    "Moechten Sie alle vorhanden Addressen ausgeben?\n"
    "Dann druecken Sie <A>\n"
    "Moechten Sie das Programm Beenden?\n"
    "Dann druecken Sie <B>\n");
    scanf("%c", &answer);

    if (answer == 'e' || answer == 'E')
    {
    scanfaddresse(&addresse[addzaehler++]);
    }
    else
    {
    printf("\nDie eingegeben Addresse ist nicht vorhanden.\n\n");
    }
    if (answer == 'a' || answer == 'A')
    {
    while( addaus < addzaehler)
    {
    printf("\n------%d. Addresse-----\n",addaus+1);
    printaddresse(&addresse[addaus++]);
    printf("\n");
    }
    addaus = 0;
    }
    else
    if (answer == 'b' ||answer == 'B')
    {
    break;
    }
    else
    {
    printf("\nFalsche Eingabe!\n\n");
    }
    }
    fflush (stdin);
    }
    system("PAUSE");
    return 0;
    }[cpp]



  • if(fscanf(datei, "%s", &help) == EOF)
    

    :xmas2: Warum weist du help vom Typ int eine Zeichenkette zu? :xmas2:

    Zeh Mau



  • Das Stimmt, ist ein schmarrn!
    müßte glaube ich
    char help[20];
    aber da stürzt mein compiler ab 😞
    werde morgen noch mal genauer nach der ursache forschen.
    danke bis dahin



  • if(fscanf(datei, "%s", &help) == EOF)
    

    :xmas2: Wenn fscanf fehl schlägt wird ein negativer Wert zurückgegeben, wieso ist das immer EOF? :xmas2:

    Zeh Mau



  • wenn fscanf nichts (mehr) einliest gibt es -1 zurück
    und EndOfFile hat auch den wert -1



  • Ein negativer Wert ist nicht immer -1!!!



  • if((eingelesen = fscanf(datei, "%s", &help)) == EOF)

    So ich hab des jetzt mal geändert( auch oben im program) das die Variable help char ist und eingelesen vom typ int.
    Das Programm funktioniert wieder wie vorher.
    Weiß allerdings nicht warum das Programm vorher, trotz logischem Fehler lief!



  • hab jetzt meine einlese Funktion nochmal umgeschrieben und so klappts dann auch
    aber weiß leider nicht was ich im Programm s.o. anders machen müsste.

    int fscanfaddresse(struct daten *pdaten,int anzahl)
    {    
        FILE *datei;
    	int einleseergebnis, addaus;
    
    	datei = fopen("addresse.txt","r");
    
    	if (datei == NULL)
    	{
    		printf("Datei kann nicht geoeffnet werden.\n");
    		return 0;
    	}
    
        for(addaus=0; addaus < anzahl; addaus++)
    	{
    		einleseergebnis = fscanf(datei, "%s", pdaten[addaus].name);
    		if (einleseergebnis == EOF)
    		{
    			break;
    		}
    		fscanf(datei, "%s", pdaten[addaus].vorname);
            fscanf(datei, "%s", pdaten[addaus].strasse);
            fscanf(datei, "%s", pdaten[addaus].hausnummer);
            fscanf(datei, "%s", pdaten[addaus].postleitzahl);
            fscanf(datei, "%s", pdaten[addaus].ort);
            fscanf(datei, "%s", pdaten[addaus].telenr);
    	}
    	fclose(datei);
    
    	return addaus;
    }
    

    thx
    cu



  • des Problem oben war, dass du die Datei bei jedem Aufruf von fscanfadrese neu geöffnet hast und die ersten paar Strings eingelesen hast, dann haste des in des struct eingelesen und die Datei wieder geschlossen. Beim nächsten Aufruf haste genau desselbe gemacht, was heißt, du kriegst immer den gleichen Datensatz aus deiner File raus. Du könntest die Datei an einer zentralen Stelle (z.b. main()) öffnen und dann den entsprechenden I/O Funktionen jeweils bloß den FILE * übergeben, damit sollte es zumindest gehen, denk ich mal, dann kannste fscanfadresse auch in ner schleife von außen her aufrufen, solange die Datei geöffnet bleibt. Andererseits könntest dir den Offset des bereits eingelesenen merken und, wenn du die Datei in der Funktion jeweils öffnest, um den eingelesenen Offset nach vorne fseek()en. Aber ich denke die Sache mit dem FILE * ist sinnvoller (und schöner) so weit.


Anmelden zum Antworten