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.
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
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. –
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