2017-03-15 3 views
2

Heute bin ich über Datei in C zu lernen und kommen mit einem ProblemWie liest man die Datei und validiert die Eingabe?

Zuerst habe ich, wie unten eine Textdatei erstellt:

5 1 5 2 4 -3 

Das erste Element ist die Array-Größe, und ich schrieb eine Funktion lesen alle positiven Wert in einen ganzzahligen Array mit diesem Code:

void readFileToArray(char *fname, int *a, int *pn) { 
    int number; 
    int quantity; 
    FILE *fp = fopen(fname, "r"); 
    fscanf(fp, "%d", &quantity); 
    while (*pn < quantity) { 
     fscanf(fp, "%d", &number); 
     if (number >= 0) { 
      a[*pn] = number; 
      (*pn)++; 
     } 
     else 
      quantity--; 
    } 
    fclose(fp); 
} 

und lesen erfolgreich 1 5 2 4 in das Array

Next ich die Textdatei in diesen

5 1a 5 2 4 -3 

Dank Tutorialspoint, geändert habe ich herausgefunden, wie 1a zu beseitigen und mit dem mit diesem Code

void readFileToArray(char *fname, int *a, int *pn) { 
    int number, test; 
    char space; 
    int quantity; 
    FILE *fp = fopen(fname, "r"); 
    fscanf(fp, "%d", &quantity); 
    while (*pn < quantity) { 
     fpurge(stdin); 
     test = fscanf(fp, "%d%c", &number, &space); 
     if (test != 2 || space != ' ') 
      quantity--; 
     else { 
      a[*pn] = number; 
      (*pn)++; 
     } 
    } 
    fclose(fp); 
} 

jedoch 5, 2, 4 in das Array gelesen Textdatei

5 1a a5 2 4 -3 

Der vorhergehende Codeblock die Datei nicht in einem Array lesen. Als ich zum Debuggen versucht, bemerkte ich den Code unten Linie

test = fscanf(fp, "%d%c", &number, &space); 

Es lesen a5 und zurückgegebene Wert 0, was richtig ist. Zu diesem Zeitpunkt:

number = 1 
space = a //because it cannot read a5 into the format %d%c 

jedoch beim nächsten Schleifendurchlauf, die Anzahl und Raum gehalten noch den Wert 1 und ein bis Schleifenende. Programm-Exit ohne Wert in das Array eingelesen

Kann mir jemand erklären, warum und schlagen Sie mir eine Lösung vor?

P/s: Entschuldigung für mein schlechtes Englisch.

+2

Ich würde vorschlagen, dass Sie lesen, wie man eine Zeichenfolge auf der Grundlage von Leerzeichen '' '' Zeichen. Analysieren Sie dann einzelne Token, um zu prüfen, ob sie Integer sind, und wenn sie Integer sind, dann konvertieren Sie die Token in Integer und fügen Sie sie dann in Array ein. – sameerkn

+0

Zunächst sollten Sie immer den von 'fscanf()' zurückgegebenen Wert überprüfen. Es ist ziemlich schwierig, die Daten dieses Aufrufs zu überprüfen, wenn Sie nicht einmal wissen, ob es funktioniert hat. –

+1

Die Verwendung von 'fscanf' beschränkt Ihr Programm auf 1 festgelegte Weise.Stattdessen empfehle ich die Verwendung von 'fgetc', es liest eine Datei Zeichen für Zeichen und dann können Sie' ASCII' Werte verwenden, um zu bestimmen, ob Sie dieses Zeichen brauchen oder nicht. – Sma

Antwort

1

In Ihrem Code sucht der Funktionsaufruf fscanf() nach einem Muster im Eingabestrom (dh dem Text in Ihrer Datei), der mit einer Dezimalzahl beginnen sollte. Da "a5" nicht mit einer Ganzzahl oder einem Vorzeichen ('-') beginnt, tritt ein Übereinstimmungsfehler auf. Wenn der Übereinstimmungsfehler auftritt, wird das Zeichen "a" in den Stream zurückgeschoben, und die fscanf-Funktion kehrt zurück. Während der folgenden Schleifen passiert dasselbe, da der Eingabestrom aus einer Datei stammt und sich nicht ändert.

Ein sehr ähnliches Problem wurde in der folgenden Stack-Überlauf Thread diskutiert: Behavior of fscanf when format doesn't match file contents

Da Sie erwähnt, dass Sie C lernen, würde ich Sie auf den verschiedenen Code-Beispiele in der „The C Programming Language aussehen vorschlagen durch K & R "Buch. Ich erinnere mich, dass einige der Beispiele getchar() verwenden, um Eingaben von stdin zu analysieren. Sie können die gleichen Methoden aber mit fgetc (wie bereits von Sma erwähnt) verwenden. Ich bin sicher, dass Sie viel Spaß beim Lesen des Buches (Und lernen Sie die Sprache zur gleichen Zeit!)

Verwandte Themen