wiedermal sscanf



  • Abend,

    komme trotz man usw. mit dem formatierten auslesen sscanf nicht weiter.
    Ich lese zeilenweise meine Datei aus.

    z.b.

    000001 ; S ; Das ist Meldung 1 ; 1 ; 2 ; 3 ; 4

    danach möchte ich mit sscanf die Werte zwischen den ";" herauslesen

    sscanf ( zeile , "%i5 %[^;]%s .... oder so ähnlich.

    Ich habe wirklich gute Bücher....aber man kann immer einfaches auch kompliziert erklären.

    Danke
    worst_case



  • '%i5' will einen Integer gefolgt von einer '5' (und einem Leerzeichen uswusf) aus 'zeile' lesen. Feldbreitenangaben werden zwischen das % und das Spezifizierungssymbol i geschrieben. Direkt anschließend willst Du alles bis zum ';' lesen, aber leider ist nach dem Integer von oben und dem folgenden Leerzeichen das nächste Zeichen ein Semikolon; das ist nicht schlimm, aber überflüssig. Das nächste '%s' liest bis zum nächsten Freiraumzeichen... Vielleicht ist sscanf hier das falsche Mittel? Man könnte einige Zeiger auf die relevanten Stringpositionen zeigen lassen (entweder von Hand oder von strtok [jegen das ich eine Abneigung habe]).



  • Hallo,

    so wie ich das verstanden habe könnte es so aussehen

    z.b.

    000001 ; S ; Das ist Meldung 1 ; 1 ; 2 ; 3 ; 4

    sscanf ( zeile , "%[^;]%i %[^;]%s %[^;]%s %[^;]%i %[^;]%i", var1, usw)

    Mit, oder ohne Leerzeichen ?

    Danke
    worst_case

    [ Dieser Beitrag wurde am 16.04.2003 um 17:15 Uhr von worst_case editiert. ]



  • Original erstellt von worst_case:
    Mit, oder ohne Leerzeichen ?

    Ohne. »Mit, oder ohne Leerzeichen?« 🙂

    Du musst eher »sscanf(data, "%[^;]; %d ; %[^;]; undsoweiterundsofort", a, b, c);« schreiben. Beachte die Semikola nach den '[^;]'.

    '%d' zwingt scanf so lange Freiraumzeichen zu lesen, bis es entweder einen int oder 'etwas falsches' erkannt wurde. '%s' funktioniert genauso und stellt, sobald 'nach etwas wichtigem' wieder ein Freiraumzeichen auftritt seine Leseaktivität ein.



  • Hallo,

    irgendwie funkt das bei mir nicht.

    z.b.

    000001 ; S ; Das ist Meldung 1 ; 1

    sscanf ( zeile , "%[^;]; %d ; %[^;]; %s ; %[^;]; %s ; %[^;]; %i", &nummer1, zeichen , meldungstext, &nummer2)

    sollte doch so gehen. tut's aber nicht und ich weiß nicht warum.

    Danke
    worst_case



  • Original erstellt von worst_case:
    sscanf ( zeile , "%[^;]; %d ; %[^;]; %s ; %[^;]; %s ; %[^;]; %i", &nummer1, zeichen , meldungstext, &nummer2)

    '%[^;]' schreibt den Inhalt nach '&nummer1', '%d' nach 'zeichen' usw usf.

    Ich weiß ja immer noch nicht, was Du eigentlich machen willst,; tut folgendes Programm etwa das, was deinen Erwartungen entspricht?

    #include <stdio.h>
    
    int main(void)
    {
         int nummer1, nummer2;
         char zeichen, meldungstext[100];
    
         sscanf("000001 ; S ; Das ist Meldung 1 ; 1",
            "%d ; %c ; %[^;]; %d", &nummer1, &zeichen, meldungstext, &nummer2);
         printf("%d\n%d\n%c\n%s\n", nummer1, nummer2, zeichen, meldungstext);
         return 0;
    }
    


  • Hallo,

    da das doch ein Brief mit sieben Siegeln bleiben wird für mich, habe ich doch wieder strtok eingesetzt.

    Danke
    worst_case


Anmelden zum Antworten