Formatiertes Einlesen funkioniert nur bedingt



  • Hallo an alle!

    Ich schreibe gerade ein Kartei Programm. Dabei sollten die Datensätze in eine Text Datei gespeichert werden das Funktioniert auch. MAnn muss aber auch die die Text Datei mit dem Programm auslesen können.

    Hier die derzeitigen Funktionen:

    DataOut:

    void dataOut(struct Schueler* s, int anz)
    {
    	FILE* dat;
    	int i;
    
    	dat = fopen("liste.txt", "w+");
    
    	if(dat == NULL)
    	{
    		printf("\a\nDatei konnte nicht geoeffnet werden !!\n");
    		return;
    	}
    
    	putc('#', dat);
    	fprintf(dat, "%d\n", anz);
    
    	for(i = 0; i < anz; i++)
    	{
    		fprintf(dat, "%d, %s, %s, %s, %s, %s, %s, %d, %d, %d, %s, %s\n", s[i].KNr, s[i].vorname, s[i].nachname, s[i].adresse.str, s[i].adresse.hnr, s[i].adresse.plz, s[i].adresse.ort, s[i].geburtstag.tag, s[i].geburtstag.monat, s[i].geburtstag.jahr, s[i].telNr, s[i].email);
    	}
    
    	fclose(dat);
    }
    

    DataIn:

    void dataIn(struct Schueler* s, int* anz)
    {
    	FILE* dat;
    	int i;
    
    	dat = fopen("liste.txt", "r");
    
    	if(dat == NULL)
    	{
    		printf("\nDatei konnte nicht geoeffnet werden oder existiert nicht!!");
    		return;
    	}
    
    	if(getc(dat) != '#')
    	{
    		printf("\nKonnte Anzahl der Elemente nicht finden!!");
    		return;
    	}
    
    	fscanf(dat, "%d", &(*anz));
    
    	for(i = 0; i < *anz; i++)
    	{
    		fscanf(dat, "%d, %s, %s, %s, %s, %s, %s, %d, %d, %d, %s, %s\n", &s[i].KNr, s[i].vorname, s[i].nachname, s[i].adresse.str, &s[i].adresse.hnr, s[i].adresse.plz, s[i].adresse.ort, &s[i].geburtstag.tag, &s[i].geburtstag.monat, &s[i].geburtstag.jahr, s[i].telNr, s[i].email);
    	}
    }
    

    Jedoch hab ich das Problem, dass beim Einlesen, beim Vornamen ein Beistrich im String steht. Der nicht dort hin gehört. Warum ist das so?

    Gibts sonst noch Verbesserungsvorschläge?

    Danke im Voraus
    mfg Razer



  • scanf ist immer so ein unsicherer Geselle mit ganz eigenen Regeln. Du darfst
    beispielsweise keine Leerzeichen im String haben. "Martin Josef" werden als
    zwei Strings angesehen.

    Bei mir hat Schreiben so funktioniert:

    for (i = 0; i < anz; i++)
        { fprintf(dat, "%d\n", s[i].KNr);
          fprintf(dat, "%s\n", s[i].vorname);
          fprintf(dat, "%s\n", s[i].nachname);
    

    Und Lesen:

    for (i = 0; i < *anz; i++)
        { fscanf(dat,  "%d", &s[i].KNr);
          fscanf(dat, " %s",  s[i].vorname);
          fscanf(dat, " %s",  s[i].nachname);
    

    Du könntest aber auch eine ganz Zeile mit fgets einlesen und mit Dich mit
    strtok durcharbeiten.


Anmelden zum Antworten