fscanf und Newline-Zeichen

Lesezeit: 2 Minuten

Benutzeravatar von Yang
Yang

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.

  • 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 konsumieren getchar().

    – 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

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.

Benutzeravatar von askmish
fragenmish

Das wird funktionieren:

fscanf(configuration,"%[^=]=%[^;];%[^\n]",name,option,dummy);

Sie müssen das Zeilenumbruchzeichen verbrauchen. Andernfalls verbleibt der Zeilenumbruch im Eingabestrom.

  • hmm… also wie groß sollte der Dummy sein? Groß genug, um alle möglichen Newline-Zeichen zu schlucken?

    – Jan

    4. November 2012 um 19:21 Uhr

  • Da Sie sagten, Sie hätten ein strikt vordefiniertes Format der Eingabedaten, könnten Sie die Nr. berechnen. der genau benötigten Zeichen und erstellen Sie die Dummy-Variable. Dies wird Ihnen helfen, mögliche Abweichungen vom Eingabeformat herauszufinden, anstatt sie zu überspringen (was passieren wird, wenn Sie ein Leerzeichen vor oder nach in fscanf oder fgets verwenden).

    – fragmisch

    4. November 2012 um 19:46 Uhr

  • Da ist ein % fehlt am Ende, warum nicht verwenden %[^=]=%[^;];%*[^\n] und vergessen Sie diese Zeilenumbrüche und den Puffer, um sie zu enthalten?

    – effe

    4. November 2012 um 19:56 Uhr

  • @effeffe: Das ist auch eine gute Idee. Die Frage des OP besagte, dass das Format der Eingabezeichenfolge festgelegt wird. Daher habe ich diesen Ansatz verwendet, da ich dachte, dass es nützlich sein könnte, herauszufinden, ob eine Zeile in der Datei die Kriterien für das feste Format nicht erfüllt. 🙂

    – fragmisch

    4. November 2012 um 20:16 Uhr

1443740cookie-checkfscanf und Newline-Zeichen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy