fscanf() - Satz mit Leerzeichen auslesen
-
Hi Leute,
hätte nochmal eine kleine Frage bei der ich nicht weiterkomme. Ich möchte in einer Textdatei (.txt) einen Satz mit Leerzeichen, das ist nämlich das Problem, abspeichern und wieder auslesen. Abspeichern hab ich hinbekommen mit dem Formatzusatz [^\n] siehe Code unten.
fflush(stdin); PLAYER_STATUS[0] = '\0'; scanf("%[^\n]s",&PLAYER_STATUS); printf("\n");
aber beim auslesen geht es nicht
fscanf(pt_file,"%[^\n]s\n%[^\n]s\n%[^\n]s\n%[^\n]s\n%[^\n]s\n%[^\n]s\n",&PLAYER_FIGHTING,&PLAYER_ARCHERY,&PLAYER_CHANNELING,&PLAYER_WEAPON,&PLAYER_MEDPATH,&PLAYER_MEDLEVEL);
habt ihr da eine Idee warum? Hat das vll mit dem Tastarturpuffer zu tun?
Danke schonmal!
MfG.
EviloKnievel
-
1. Was verstehst du unter abspeichern und auslesen?
Normalerweise wird mit scanf oder fscanf eingelesen und mit printf ausgegeben (mit fprintf auch abgespeichert).
Ich sehe aber nur die scanf/fscanf.2. Der Fromatspecifier den du da benutzt ist [] und nicht []s
Das ist ein eigener Formatspecifier und keine Modifikation von s.
Da in deiner Eingabe Wahrscheinlich kein s mehr hinter dem \n kommt, bricht scanf ab.
Stehen die Daten überhaupt in verschiedenen Zeilen?Tipp: Schau dir den Rückgabewert von scanf an. Der gibt die Anzahl der gelesenen Elemente an. Sollte bei deinem Beispiel 6 sein.
3. Ist ein & beim einlesen von Strings eher ungewöhnlich.
-
1. Dasselbe wie du, war dort etwas undeutlich. Der obere Code bezieht sich auf das Erstellen eines Strings mit mehreren Worten (Leerzeichen getrennt), welcher dann in einer Datei abgelegt werden sollte.
2. Oh danke dann hatte ich da was falsch verstanden. Zur Sicherheit frage ich nochmal nach: Also ist der Unterschied zwischen %[^\n] und %s ,das %[^\n] solange einließt bis "\n" kommt und %s solange einließt bis ein Whitespace-Zeichen "\t,\n,..." kommt?
Stehen die Daten überhaupt in verschiedenen Zeilen?
Ja, jede Zeile ein String und jeder String enthält mehrere mit leerzeichengetrennte "Wörter".
3. Ist das problematisch ich habe mich an das Skript meines Professors gehalten.
Und danke für die aufschlussreiche Antwort.
-
EviloKnievel schrieb:
Ja, jede Zeile ein String und jeder String enthält mehrere mit leerzeichengetrennte "Wörter".
Warum dann kein fgets? Das ist sicherer, da du die Größe des Arrays angeben musst. (Da wird dann allerdings das '\n' mit abgelegt, kann man dann aber auch löschen)
EviloKnievel schrieb:
3. Ist das problematisch ich habe mich an das Skript meines Professors gehalten
Ja, das ist problematisch. Das & hat bei Arrays nichts zu Suchen.
(Bei normalen Variablen gehört es allerdings hin)Anmerkung:
Mit nur Großbuchstaben werden in C i.A Makros bezeichnet.Zeig doch mal die Definition von deinen Variablen die du da einliest.
-
also Programm läuft jetzt wie es soll lag am "s" hinter den [^\n].
kannst du mir nochmal meine Verständnisfrage beantworten dann wüsste ich ob ich das jetzt verstanden habe
EviloKnievel schrieb:
2. Oh danke dann hatte ich da was falsch verstanden. Zur Sicherheit frage ich nochmal nach: Also ist der Unterschied zwischen %[^\n] und %s ,das %[^\n] solange einließt bis "\n" kommt und %s solange einließt bis ein Whitespace-Zeichen "\t,\n,..." kommt?
DirkB schrieb:
Warum dann kein fgets?
Gewohnheit ;), wäre sicher auch mit fgets gegangen.
char PLAYER_FIGHTING[100], PLAYER_ARCHERY[100], PLAYER_CHANNELING[100], PLAYER_WEAPON[100], PLAYER_MEDPATH[100], PLAYER_MEDLEVEL[100];
Asche auf mein Haupt, ja ich weiß das man Variable normal nicht groß schreibt. Aber ich finde es übersichtlicher Variable und den Rest so zu unterscheiden.
-
EviloKnievel schrieb:
2. Oh danke dann hatte ich da was falsch verstanden. Zur Sicherheit frage ich nochmal nach: Also ist der Unterschied zwischen %[^\n] und %s ,das %[^\n] solange einließt bis "\n" kommt und %s solange einließt bis ein Whitespace-Zeichen "\t,\n,..." kommt?
%s überliest noch führende Whitespace.
%[] kann noch mehr
Siehe scanfEviloKnievel schrieb:
Gewohnheit ;), wäre sicher auch mit fgets gegangen.
Und auch sicherer. Du solltest die Länge auch bei scnaf mit angeben:
scanf("%99[^\n] ",
Allerdings ist das bei fgets leichter, vor allem wenn die Länge variabel ist.
EviloKnievel schrieb:
Asche auf mein Haupt, ja ich weiß das man Variable normal nicht groß schreibt. Aber ich finde es übersichtlicher Variable und den Rest so zu unterscheiden.
An diese Vereinbarung (Makros groß der Rest klein bzw. gemischt) halten sich aber alle anderen C-Programmierer nicht ohne Grund.
Man kann so Makros von Variablen und Funktionen unterscheiden. Funktionen kann man an den () von Variablen unterscheiden.EviloKnievel schrieb:
ich habe mich an das Skript meines Professors gehalten.
Wenn das da so drin steht, schmeiß es weg.