fscanf() liest wirre Werte ein...



  • Hallo erstmal...

    Ich wollte für ein kleines Spiel Gegnerdaten aus einer Datei einlesen.

    Mein Code sieht so aus:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    	FILE *stindor = fopen("./stindor.mon", "r");
    	char *name, *text, typ;
    	int nummer, iniangr, iniver, inispez, inilp;
    	fscanf(stindor, "nummer=%i;name=%c;text=%c;iniangr=%i;iniver=%i;inispez=%i;inilp=%i;typ=%c;", &nummer, name, text, &iniangr, &iniver, &inispez, &inilp, &typ);
    	printf("Nummer:%d\nName:%s\nText:%s\nIniAngr:%d\nIniVer:%d\nIniSpez:%d\nIniLP:%d\nTyp:%c\n", nummer, name, text, iniangr, iniver, inispez, inilp, typ); 
    }
    

    Und die stindor.mon so:

    nummer=6;
    name=Stindor;
    text=Sie sind bösartige Fische.;
    iniangr=4;
    iniver=2;
    inispez=5;
    inilp=7;
    typ=W;
    

    Die Ausgabe leider so:

    Nummer:6
    Name:|�   //Zufallswert
    Text:��>   //Zuffallswert
    IniAngr:-1077249448 //Zufallswert
    IniVer:134520820    //Zufallswert
    IniSpez:12966752    //Zufallswert
    IniLP:134513468     //Zufallswert
    Typ:�              //Zufallswert
    

    Kann man mit fscanf() überhaupt so lesen?
    Als ich über die für mich weniger attraktive Token-Methode recherchiert habe, habe ich das so gesehen und daher auch die Idee http://www.uni-protokolle.de/foren/viewt/173563,0.html
    Wenn ich in der Eingabedatei die Newlines entferne gibts Speicherzugriffsfehler.

    vielen Dank schonmal(wieso darf ich nicht v.o.r.r.a.u.s schreiben)



  • Du hast die char-Zeiger nicht initialisiert und schreibst deshalb die Werte irgendwo in den Speicher. Außerdem liefert %c keinen null-terminierten String zurück.

    therufuser schrieb:

    vielen Dank schonmal(wieso darf ich nicht v.o.r.r.a.u.s schreiben)

    Das fragst du am besten deinen Duden 😉



  • Deine Strings brauchen auch Speicherplatz, wo der Text hingeschrieben werden soll.
    Nur mit Zeigern kommst du nicht weit

    char name[200], text[200], typ;
    

    Bei fscanf solltest du nach den ';' noch ein Leerzeichen ' ' einfügen. Das Leerzeichen steht für White Spaces (nicht druckbare Zeichen wie \t \n und ' ')

    therufuser schrieb:

    wieso darf ich nicht v.o.r.r.a.u.s schreiben)

    Schon mal mit der richtigen Schreibweise voraus probiert?



  • Also gut...
    Ich habe jetzt

    char name[16], text[128], typ[5];
    

    und

    fscanf(stindor, "nummer=%i name=%s text=%s iniangr=%i iniver=%i inispez=%i inilp=%i typ=%s ", &nummer, name, text, &iniangr, &iniver, &inispez, &inilp, typ);
    

    fscanf() funktioniert so auch ohne Trennzeichen wie ';' zerreist mir aber durch die ' '(auch mit';' dazwischen) den Text-String.

    Ausserdem habe ich leider noch Probleme mit den Integern.

    Danke im Voraus nochmal 🙂



  • therufuser schrieb:

    fscanf() funktioniert so auch ohne Trennzeichen wie ';' zerreist mir aber durch die ' '(auch mit';' dazwischen) den Text-String.

    %s liest nur bis zum nächsten Whitespace, wenn du ein anderes Ende-Zeichen benötigst, kannst du "%[^;]" (lies alles bis zum Semikolon) verwenden.

    Ausserdem habe ich leider noch Probleme mit den Integern.

    Und wie äußern die sich?



  • Jetzt kann ich Nummer, Name und Text lesen...

    Typ bleibt weiss, Interger sind konstante(bei jeder Ausführung), falsche werte.



  • Ein Vorschlag: nimm mal den Rückgabewert von fscanf() entgegen, dann siehst du, wieviel von der Eingabe die Funktion tatsächlich einlesen konnte.



  • Die ersten drei.. der Rest sind schlichte Misserfolge...

    Aber ich nerv jetz lieber nicht mehr rum... gute nacht.



  • So geht jetzt alles.
    Man muss nur die Strings am Ende einlesen.

    Sieht jetzt so aus:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    	FILE *stindor = fopen("./stindor.mon", "r");
    	char name[16];
    	char text[128];
    	char typ;
    	int nummer = 0;
    	int iniangr, iniver, inispez, inilp;
    	fscanf(stindor, "nummer=%d iniangr=%d iniver=%d inispez=%d inilp=%d typ=%c name=%s text=%[^;] ", &nummer, &iniangr, &iniver, &inispez, &inilp, &typ, name, text);
    	printf("Nummer:%d\nName:%s\nText:%s\nIniAngr:%4i\nIniVer:%4d\nIniSpez:%4d\nIniLP:%4d\nTyp:%c\n", nummer, name, text, iniangr, iniver, inispez, inilp, typ); 
    }#include <stdio.h>
    #include <string.h>
    
    int main()
    {
    	FILE *stindor = fopen("./stindor.mon", "r");
    	char name[16];
    	char text[128];
    	char typ;
    	int nummer = 0;
    	int iniangr, iniver, inispez, inilp;
    	fscanf(stindor, "nummer=%d iniangr=%d iniver=%d inispez=%d inilp=%d typ=%c name=%s text=%[^;] ", &nummer, &iniangr, &iniver, &inispez, &inilp, &typ, name, text);
    	printf("Nummer:%d\nName:%s\nText:%s\nIniAngr:%4i\nIniVer:%4d\nIniSpez:%4d\nIniLP:%4d\nTyp:%c\n", nummer, name, text, iniangr, iniver, inispez, inilp, typ); 
    }
    

    stindor.mon dementsprechend so:

    nummer=6
    iniangr=4
    iniver=2
    inispez=5
    inilp=7
    typ=W
    name=Stindor
    text=Sie sind bösartige Fische.;
    

    Danke nochmal an euch zwei. Auch für die Rechtschreibstunde 🙂


Anmelden zum Antworten