2016-06-26 8 views
0

Ich bin in einer Textdatei wie folgt aus fscanf:fscanf liest eine zweimal Linie

T 1 1000 
T 2 700 
N 3 450 
Y 4 200 

Ich versuche, um die Linien zu zählen ein malloc zu verwenden und zu tun, dass ich benutze:

Prize temp; 
int count =0; 
while ((fscanf(fa,"%c %d %f", &temp.A, &temp.B, &temp.C))!= EOF) 
count ++; 

wo Preis ist eine Struktur:

typedef struct { 
    char A; 
    int B; 
    float C; 
} Prize; 

So, nachdem die Linien das Programm liest druckt mir dies:

A: T B: 1 C: 1000.0000 
A: B: 0 C: 0.0000 
A: T B: 2 C: 700.0000 
A: B: 0 C: 0.0000 
A: N B: 3 C: 450.0000 
A: B: 0 C: 0.0000 
A: Y B: 4 C: 200.0000 

Verwenden des Debuggers ich bemerkt, dass fscanf (zum Beispiel, während die erste Zeile lesen) erhält:

A = 84 'T', B = 1, C = 1000

und anstelle des Lesens In der zweiten Zeile liest es eine weitere erste Zeile, aber wie folgt aus:

A = 10 '\ n', B = 1, C = 1000

und weiterhin für jede Zeile tun dies aber die letzte.

Ich kontrollierte die Datei und es hat keine zusätzlichen Leerzeichen oder Zeilen.

Irgendwelche Vorschläge, um das Problem zu lösen?

+1

'fscanf (fa, "% c% d% f", ...)' ' – melpomene

+2

fscanf (fa, "% c% d% f", & temp.A, & Temp.B, & Temp. C)) '->' fscanf (fa, "% c% d% f", & temp. A, & temp.B, & temp.C)) ' –

+3

Außerdem ist'! = EOF' keine komplette Lösung, es muss auch '== 3' sein. –

Antwort

1

Ihre Datei enthält Zeilenumbrüche. So ist die Folge von Zeichen in der Datei ist wirklich, wie folgend:

T 1 1000\nT 2 700\n... 

Die erste fscanf liest 'T', 1 und 1000. Es stoppt bei '\n' Zeichen.

Die Sekunden fscanf liest das '\n' Zeichen zu temp.A. Jetzt ist es beim zweiten "T" -Zeichen. Daher ist es nicht in der Lage temp.B und temp.C

Die dritte fscanf lesen liest 'T', 2 und 700, aber hält an '\n' wieder.

Sie alle Leerzeichen vor dem Lesen temp.A überspringen sollen, die durch den Raum im Formatstring erfolgt:

...fscanf(fa," %c %d %f", &temp.A, &temp.B, &temp.C)... 
0

Das %c Format der Lese keinen space oder \n Charakter ignorieren würde, die es sogar ist unsichtbar. Wie auch immer, %s %d %c wird. Es ist wahrscheinlich der bessere Weg, die Inkonsistenz zu vermeiden, wenn %c durch %s ersetzt wird (und ein einzelnes Zeichen eine Zeichenkette ist).

char str[maxn]; 
fscanf(fa, "%s%d%f", str, &temp.B, &temp.C); 
temp.A = str[0];