2015-09-20 19 views
5
char id; 
int num, r; 
if (argc != 2) { 
    printf("error\n"); 
    exit(1); 
} 

FILE *file = fopen(argv[1], "r"); 
if (file == NULL) { 
    printf("error\n"); 
    exit(1); 
    } 

    while ((r = fscanf(file, "%c\t%d", &id, &num)) != EOF) { 
    if(r == 2) { 
     printf("id: %c, value: %d\n", id, num); 
    } 
    else if (r!=2) { 
     printf("bad input\n"); 
    } 
    } 

Die Datei Ich versuche, sieht aus wie zu lesen:fscanf - ich weiß nicht, was ich falsch mache hier

i 10

i 12

d 10

d 12

(Das Zeichen/Integer sind tabulatorgetrennt). Meine Ausgabe ist:

id: i, Wert: 10

schlechter Eingang

id: i, Wert: 12

schlechter Eingang

id: d, value: 10

schlechter Eingang

ID: d, Wert: 12

schlecht Eingang

Was mache ich falsch? "Falsche Eingabe" sollte NUR gedruckt werden, wenn die Datei falsch formatiert ist. Die obige Datei zeigt eine ordnungsgemäß formatierte Datei. Ich verstehe nicht, wie r == 2 und r != 2 zur gleichen Zeit (beide Bedingungen sind irgendwie erfüllt).

+0

Nicht nach scanf suchen, um EOF zurückzugeben. Sie sollten prüfen, ob die Anzahl der erwarteten Artikel zurückgegeben wird oder nicht. –

+0

'\ n' und Leerzeichen haben ebenfalls Bedeutung. – Matt

+0

Sie sollten nicht "beenden", wenn Sie eine 'FILE' geöffnet haben: es wird nicht sauber geschlossen. – edmz

Antwort

4

Verwenden

while((r = fscanf(file, " %c\t%d", &id, &num)) != EOF) //Whitespace before %c 

könnte Ihr Problem lösen. Denn wenn Sie

verwenden, hinterlässt es ein Newline-Zeichen, das in der nächsten Iteration verbraucht wird. Als Ihre nächste Iteration bekommt Ihr id\n bekommen und num bekommt das Zeichen.

Aber wenn Sie setzen zusätzliche Leerräume vor %c die fscanf() Leerzeichen zu ignorieren erzählt (einschließlich Tab, Leerzeichen oder Newline). So erhält Ihr fscanf() zwei Parameter (Zeichen und Nummer). Bitte

+3

Sieht so aus, als hätte es funktioniert! Können Sie mir bitte erklären, warum der Whitespace den Unterschied gemacht hat? Ich danke dir sehr! – Sara

+0

Große Antwort. Vielen Dank. – Sara

2

ändern
while ((r = fscanf(file, "%c\t%d", &id, &num)) != EOF) { 

zu

while ((r = fscanf(file, "%c\t%d\n", &id, &num)) != EOF) { 

Hinzufügen \ n am Ende in fscanf.

In Ihrer Datei werden Zeilen mit \ n abgeschlossen. In nächsten lesen geht es nicht gut.