2013-03-08 15 views
5

Ich versuche, eine Datei in dieser allgemeinen Weise formatierte zu lesen:C - fscanf Gemischte Zahlen und statischen Text

Text Description: 12 
Description2: 1 
More descriptive things: 6 

Und ich würde die Zahlen wie 12, 1 zu lesen, und 6 in Variablen.

ich Code wie folgt versucht:

fscanf(fptr, "Text Description:%d",&desc1); 
fscanf(fptr, "Description2:%d",&desc2); 
fscanf(fptr, "More descriptive things:%d",&desc3); 

Aber aus irgendeinem Grund nur die erste Variable bevölkert wird. Weiß jemand, warum das so ist?

Antwort

1

space das zu vermeiden:

fscanf(fptr, "Text Description:%d",&desc1); 
fgetc(fptr); // drop the next character 
fscanf(fptr, "Description2:%d",&desc2); 

alle Stromeingang nach der Ganzzahl Dropping und bis zum nächsten ‚\ n‘ kann mit einer Schleife statt erfolgen neue Linie Probleme

fscanf(fptr, " Text Description:%d",&desc1); 
fscanf(fptr, " Description2:%d",&desc2); 
fscanf(fptr, " More descriptive things:%d",&desc3); 
+2

'% d' verbraucht bereits alle vorhergehenden Leerzeichen. Die einzigen '%' s, die keine Leerzeichen verbrauchen, sind '% c' und'% ['. – Shahbaz

+0

In diesem Fall muss er nur Platz am Anfang des String-Formats hinzufügen. Vielen Dank für die Antwort der Antwort aktualisiert – MOHAMED

0

Sie lesen den Zeilenumbruch nicht mehr, nachdem Sie die 12 verarbeitet haben. Daher finden die anderen beiden Aufrufe diesen statt der Zeichenfolge oder Ganzzahl und daher fehlgeschlagen. Sie können ein Leerzeichen im nächsten fscanf-Aufruf verwenden (der alle Leerzeichen vor der Zeichenfolge verwendet, die Sie abgleichen möchten). Alternativ können Sie es mit einem Anruf zu fgetc verbrauchen, solange jede Zeile sofort mit einem Zeilenvorschub, z. am Anfang des String-Format

while (fgetc(fptr) != '\n') 
    ; 
+0

ich ein '&& feof (fptr)' auf die while-Schleife für alle Fälle (vielleicht überprüfen 'ferror' auch wenn Sie zu paranoid sind;) würde hinzufügen – Shahbaz

+0

@Shahbaz: ja , aber ich gehe davon aus, dass diese Eingabedatei wie angegeben ist. Es würde viele Überprüfungen für unzuverlässige Eingabedateien erfordern. – teppic

+0

Besser gegen 'EOF'. Ein Aufruf von "feof" ohne gefundenes'EOF' wäre fehlerhaft. – md5