2016-04-28 12 views
0

Ich versuche, einige Daten aus einer Datei zu lesen, dann drucken Sie es aber Mein Code liest nur den ersten Inhalt und bleibt dann in einer Endlosschleife (in der Weile Schleife). Was mache ich falsch? Meine Ausgabe ist nur Student: Abby GPA: 3 Ich benutze Visual Studio 2012. Ich bin nur ein Beispiel aus meinem Buch folgen.Lesen und Drucken von einer Datei, aber stecken in Schleife C

//My data is Abbie 3.4 Oakley 3.5 Sylvia 3.6 Uwe 3.7 Ken 3.8 Aaron 3.9 Fabien 4 

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void main() 
{  
    unsigned int GPA;//GPA 
    char student[10];//Student 
    FILE * cfPter; 
    //Check if file opened 
     if((cfPter = fopen("data.txt", "r")) ==NULL) 
     { 
       puts("File could not be opened"); 
      } 
     //Read Contents 
     else 
      { 
       puts("Contents of file:\n"); 
       fscanf(cfPter,"%s %f ", student, &GPA); 
      } 
     //While not at end Print the contents read 
     while(!feof(cfPter)) 
     { 
      printf("Student: %s GPA: %f",student,GPA); 
      fscanf(cfPter, "%s %f", student, GPA); 
      //system("pause"); 
     } 

    fclose(cfPter); 
    system("pause"); 
} //end main  
+1

'system (" pause ") kommt' vielleicht? –

+3

Sie wollen auch sehen, [** Warum ist "während (! Feof (Datei))" immer falsch? **] (http://StackOverflow.com/Questions/5431941/Why-is-Whow-feof-file (immer falsch? s = 1 | 2.6948) –

+0

Ihre while-Schleife sollte innerhalb Ihrer else-Klausel sein ... aber das ist es nicht. –

Antwort

0

Sie kommen dorthin, aber ein paar Verbesserungen können das Leben leichter machen. Wenn Ihr fehlschlägt, behandeln Sie entweder den Fehler, indem Sie nach einem anderen Dateinamen fragen, oder einfach return() an diesem Punkt. Auf diese Weise ist der Rest Ihres Codes nicht in eine else-Anweisung eingeschlossen.

Als nächstes lieferte ich den Link für warum while (!feof(file)) ist immer falsch (beim Lesen von Zeichendaten aus einer Datei). Wenn Sie Eingaben lesen, bestätigen Sie, dass Sie Eingaben erhalten haben - das ist wirklich alles, was Sie tun müssen. Überprüfen Sie die Rückgabe für Ihren Anruf fscanf.

, die mit im Auge, Sie etwas Ähnliches wie die folgende tun könnte:

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main (void) { 

    float GPA = 0.0;  /* GPA  */ 
    char student[10] = ""; /* Student */ 
    FILE *cfPter = NULL; 

    /* open file/validate file is open */ 
    if (!(cfPter = fopen ("data.txt", "r"))) { 
     fprintf (stderr, "error: file open failed 'data.txt'.\n"); 
     return 1; 
    } 

    /* Read Contents */ 
    while (fscanf (cfPter, " %9s %f", student, &GPA) == 2) 
     printf ("Student: %-10s GPA: %.2f\n", student, GPA); 

    fclose (cfPter); 
    return 0;     /* main is type 'int' and returns a value */ 
} 

Beispiel data.txt

$ cat data.txt 
Abbie 3.4 Oakley 3.5 Sylvia 3.6 Uwe 3.7 Ken 3.8 Aaron 3.9 Fabien 4 

Beispiel Verwendung/Output

$ ./bin/feofissue 
Student: Abbie  GPA: 3.40 
Student: Oakley  GPA: 3.50 
Student: Sylvia  GPA: 3.60 
Student: Uwe  GPA: 3.70 
Student: Ken  GPA: 3.80 
Student: Aaron  GPA: 3.90 
Student: Fabien  GPA: 4.00 

(Hinweis während MS wird Sie void main von vor langer Zeit verwenden, main ist als Typ int definiert und gibt einen Wert zurück.)

auch zu pause Sie in der Regel #include <conio.h> an Fenstern und getch(); rufen Sie das Terminal-Fenster schließt, zu verhindern. Sie können es auf jede Art versuchen. Lass es mich wissen, falls du fragen hast.

+0

Warum hast du es == 2? Ich habe auch versucht, das Tweak, aber es hat keine Fehler und es liest keine Informationen. Wie Sie es getan haben, scannt es zwei Elemente, Student und Gpa, und dann Drucken und dann weiter? – vvid

+0

'"% d% s "' ist die 'format-string', die von' fscanf' verwendet wird. Im Inneren befinden sich '2' * Conversion-Spezifizierer * ('% d' und '% s'). Die Rückgabe von 'fscanf' ist die * Match-Anzahl * erfolgreicher Conversions gemäß * format-string *. Wenn Sie also den Rückgabewert gleich "2" überprüfen, können Sie sicherstellen, dass Sie alle Werte in der Zeile lesen. Wenn Sie das Ende der Datei erreichen, werden keine Konvertierungen mehr ausgeführt und die Schleife wird beendet. –

+0

Sollte nicht "% f verwendet werden, weil es eine Dezimalzahl statt einer Ganzzahl liest? sollte es auch% s vor% d (oder f) in der Scanf in der While-Schleife sein? – vvid

0

Ich arbeite auch an this, und jemand sagte mir zu versuchen, strcmp() zu verwenden, um die Datei Zeile für Zeile zu lesen, bis Sie die gesuchte Zeile gefunden haben? Ich arbeite mit dieser Idee, aber habe nicht herausgefunden, wie es in der Lage wäre, das GPA danach zu lesen.

0

Ein Plan, der das Lesen verschiedener Datentypen in fscanf vermeidet, besteht darin, die char-Daten immer in ein lokales char-Array einzulesen. Verwenden Sie dann sscanf, um es in den benötigten Datentyp zu konvertieren. Dadurch können Sie Datenprüfungen zwischen fscanf und sscanf hinzufügen. das wird verhindern, dass fscanf nichts liest (drehende räder) und niemals zu