Ich habe fscanf, um Einstellungszeilen aus einer Konfigurationsdatei zu lesen. Diese Einstellungen haben ein streng vordefiniertes Format, das aussieht
name1=option1;
name2=option2;
...
Also im Grunde mache ich das
fscanf(configuration,"%[^=]=%[^;];",name,option);
wobei Konfiguration der Dateistrom ist und Name und Option Programmierpuffer sind.
Das Problem ist, dass der Namenspuffer ein Zeilenumbruchzeichen enthält, das ich nicht möchte. Gibt es einen Formatbezeichner, den ich im “[^…]” eingestellt, um das Zeilenumbruchzeichen zu überspringen? Wie auch immer, kann es jemals durch den Formatbezeichner gelöst werden?
BTW: Verschlucken des Newline-Zeichens, indem Sie dies schreiben
"%[^=]=%[^;];\n"
ist meiner Meinung nach nicht elegant, da sich das Zeilenumbruchzeichen überall mehr als einmal wiederholen könnte.
Fügen Sie einfach ein Leerzeichen am Ende der Formatzeichenfolge hinzu:
"%[^=]=%[^;]; "
Dies frisst alle Leerzeichen, einschließlich Zeilenumbrüche.
Zitat von cplusplus.com:
Whitespace-Zeichen: Die Funktion liest und ignoriert alle Whitespace-Zeichen, die vor dem nächsten Nicht-Whitespace-Zeichen auftreten (Whitespace-Zeichen umfassen Leerzeichen, Zeilenumbrüche und Tabulatorzeichen – siehe isspace). Ein einzelnes Leerzeichen in der Formatzeichenfolge validiert eine beliebige Menge von Leerzeichen, die aus dem Stream extrahiert wurden (einschließlich keiner).
Eine Alternative ist die Verwendung fgets()
um die gesamte Zeile in eine Zeichenfolge einzulesen, verwenden Sie dann sscanf()
. Dies hat beim Debuggen den Vorteil, dass Sie genau sehen können, an welchen Daten die Funktion arbeitet.
Das wird funktionieren:
fscanf(configuration,"%[^=]=%[^;];%[^\n]",name,option,dummy);
Sie müssen das Zeilenumbruchzeichen verbrauchen. Andernfalls verbleibt der Zeilenumbruch im Eingabestrom.
Wenn die
nameN
Felder dürfen keine Leerzeichen enthalten, fügen Sie einfach ein Leerzeichen vor der Formatzeichenfolge hinzu –" %[^=]=%[^;];"
– um führende Leerzeichen zu überspringen. Wenn dies möglich ist, müssen Sie den Zeilenumbruch selbst mit konsumierengetchar()
.– Daniel Fischer
4. November 2012 um 19:11 Uhr
Die akzeptierte Antwort ist sowieso richtig, was wiederholte Zeilenumbrüche betrifft, die Sie verwenden könnten
%*[\n]
um eine beliebige Anzahl von zu lesen'\n'
ohne sie zu speichern.– effe
4. November 2012 um 19:59 Uhr