2017-02-23 1 views
-1
int findMaxAndMinValues(FILE *file) 
{ 
    int current_number, max_number = INT_MIN, min_number = INT_MAX; 
    rewind(file); 
    while (fscanf(file, "%d", &current_number)!=EOF) 
    { 
     printf("%d \n", current_number); 
     if (current_number > max_number) max_number = current_number; 
     if (current_number < min_number) min_number = current_number;  
    } 
    printf("Max: %d, Min: %d\n", max_number, min_number); 
    return 0; 
} 

Das funktioniert also gut, wenn die Textdatei nur voll mit Zahlen (und Leerzeichen/Zeilenumbrüche entsprechend) ist. Aber wenn ich ein Zeichen darin habe, fängt es an, nur die letzte Zahl zu wiederholen, die es gelesen hat, bevor es auf das Zeichen trifft. Dies ist die Textdatei:C fscanf gibt nie zurück EOF

1 
2 
3 4 5 
16 
12312 
hello 

Und das Ergebnis ist nur 12312 jede Zeile Aktualisierung endlos.
Nebenfrage: gibt es eine bessere Möglichkeit, Min/Max-Werte von Zahlen in einer Textdatei zu finden? Anstatt mit% d fscanf? EDIT: Danke für die Antwort, hier ist, wie ich es fest:

int findMaxAndMinValues(FILE *file) 
{ 
    int current_number, max_number = INT_MIN, min_number = INT_MAX; 
    int temp; 
    rewind(file); 
    while ((temp=fscanf(file, "%d", &current_number))!=EOF) 
    { 
     if (!temp) { fgetc(file); } 
     else { 
      printf("%d \n", current_number); 
      if (current_number > max_number) max_number = current_number; 
      if (current_number < min_number) min_number = current_number; 
     } 
    } 
    printf("Max: %d, Min: %d\n", max_number, min_number); 
    return 0; 
} 
+0

Sie haben vergessen, eine Frage zu stellen. Sie haben keinen Code, um das "Hallo" in Ihrer Datei zu lesen, also liest nichts es jemals und so kommen Sie nie zum Ende der Datei. –

Antwort

2

die man-Seite lesen. fscanf() kann andere Werte außer EOF zurückgeben. Insbesondere wenn eine Konvertierung fehlschlägt - insbesondere wenn fscanf() ein nicht numerisches Zeichen vorfindet - gibt es eine Null zurück, um anzuzeigen, dass nichts gelesen wurde.

Sie müssen nach diesen Informationen handeln. Sonst wird es auch beim nächsten Mal Null zurückgeben. Und die Zeit danach, ad infinitum.

+0

"sogar Null im Falle eines frühen Übereinstimmungsversagens" Oh, ich habe es vermisst .. Danke für die Antwort. – KayleMaster

0

Der Grund dafür, dass Ihr Code unbegrenzt wiederholt wird, wenn die Programmeingabe eine Nichtnummer enthält, ist, dass fscanf() keine Eingabe verwendet, die nicht übereinstimmt, aber auch keine EOF im Falle eines Übereinstimmungsfehlers zurückgibt. EOF wird nur zurückgegeben, wenn das Ende der Eingabe vor entweder eine erfolgreiche Konvertierung durchgeführt wird oder ein Abgleichfehler auftritt oder wenn ein Lesefehler auftritt. (Ein Lesefehler ist ein E/A-Fehler - eine ganz andere Sache als ein Übereinstimmungsfehler.) Wenn Ihr bestimmtes Programm einen Übereinstimmungsfehler erfährt, springt es einfach zurück und versucht den gleichen Eingang zu lesen (wartet darauf, gelesen zu werden) nochmal.

Eine Möglichkeit, das Problem zu lösen wäre fscanf() ‚s Rückgabewert mit der Anzahl der Elemente erwartet (1), und brach aus der Schleife zu vergleichen, wenn Sie etwas anderes zu sehen, ob EOF, 0, oder was auch immer:

while (fscanf(file, "%d", &current_number) == 1) // ... 

Ihr Programm würde dann aufhören, Zahlen zu lesen, wenn es auf eine Nicht-Nummer stößt; Wenn Sie es stattdessen wollten überspringen Nicht-Nummern dann könnte das auch getan werden, aber es wäre ein bisschen komplizierter.

+0

Ja, das war genau der Fall. Ich habe einen Check hinzugefügt und es repariert (Code ist oben)! wow stackoverflow ist großartig – KayleMaster

Verwandte Themen