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 weitchar 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 jetztchar 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