Frage

Ich verwende fscanf eine Datei zu lesen, die Zeilen wie
hat Zahl <-whitespace-> string <-whitespace-> optional_3rd_column

Ich mag die Anzahl und die Zeichenfolge extrahieren aus jeder Spalte, aber die 3rd_column ignorieren, wenn es vorhanden ist

Beispieldaten:
12 foo etwas
03 bar
24 etwas #randomcomment

Ich möchte bis 12 extrahieren, foo; 03 bar; 24, etwas zu ignorieren "etwas" und "#randomcomment"

Im Moment habe ich so etwas wie

while(scanf("%d %s %*s",&num,&word)>=2)
{ 
assign stuff 
}

Dies gilt jedoch nicht ohne dritte Spalte mit den Linien arbeiten. Wie kann ich es alles nach dem zweiten String ignorieren?

War es hilfreich?

Lösung

Es wäre mir scheint, dass die einfachste Lösung ( "% d% s", & num & Wort) und dann fgets () zu essen, um den Rest der Zeile scanf ist.

Andere Tipps

Das Problem ist, dass der %*s in der nächsten Zeile die Zahl isst, wenn es keine dritte Spalte ist, und dann der nächste %d versagt, weil das nächste Token nicht eine Zahl ist. Um es zu beheben, ohne gets() von sscanf() gefolgt zu verwenden, können Sie die Zeichenklasse verwenden angegeben:

while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{ 
    assign stuff 
}

Die [^\n] sagt so viele Zeichen wie möglich zu entsprechen, die nicht Zeilenumbrüche sind, und die * unterdrückt Zuordnung wie zuvor. Beachten Sie auch, dass Sie nicht einen Raum zwischen den %s und dem %*[\n], denn sonst, dass der Raum im Format-String das Newline setzen können, würde passen, wodurch die %*[\n] die gesamte nachfolgende Zeile passen, das ist nicht das, was Sie wollen.

Mit fgets (), um eine Zeile zu einem Zeitpunkt zu lesen und dann verwenden sscanf () für die beiden Spalten suchen Sie interessiert sind, robuster und Sie haben nichts zu tun, spezielle Datenhinter zu ignorieren.

ich oft verwenden gets (), gefolgt von einem sscanf () auf der Zeichenfolge, die Sie nur, äh, GOTS.

Bonus:. Sie können den Test getrennt für End-of-Eingabe von dem Parsing

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top