Ich würde das Programm in verschiedenen Aufgaben brechen.
Der erste Schritt ist in der Lage sein, ein Paar Zeilen zu lesen, die erste Zeile, die die Anzahl der Zahlen sagt zu lesen, und dann die zweite Zeile die tatsächlichen Zahlen zu lesen. Dazu rief eine Funktion so etwas wie read_set
könnte nützlich sein. Es sollte in der Lage sein, die gelesenen Zahlen zurückzugeben und das Ende der Datei sowie Fehler zu signalisieren. Dazu können wir eine Datenstruktur wie definieren:
struct numbers {
long *data; /* or choose a type depending upon your needs */
size_t len;
};
und dann können wir unsere Funktion mit dem Prototyp deklarieren:
int read_set(FILE *fp, struct numbers *num);
Die Funktion Speicher für num->data
zuteilen wird, und legen Sie num->len
auf die korrekter Wert. Es gibt 0 für den Erfolg und ansonsten eine Reihe von Fehlerbedingungen zurück. Wir könnten Lust bekommen und später eine enum
für die Rückkehr Status verwenden. Denn jetzt, sagen wir, dass 0 = Erfolg, 1 = Ende der Datei, und alles, was ein Fehler ist.
Der Anrufer ruft dann read_set()
in einer Schleife:
struct numbers numbers;
int status;
while ((status = read_set(fp, &numbers)) == 0) {
/* process numbers->data, and then free it */
}
if (status == 1) {
/* hit end of file, everything is OK */
} else {
/* handle error */
}
Für read_set()
Umsetzung: Es hat zwei Zeilen zu lesen. Es gibt viele implementations of reading a full line in C, so dass Sie eine von ihnen verwenden können, und lesen Sie zuerst eine Zeile, dann sscanf()
/strtoul()
es für eine Nummer (überprüfen Sie den Rückgabewert!). Sobald Sie die Anzahl der Zahlen, n
, können Sie die nächste Zeile in dem Speicher gelesen, und tun:
num->data = malloc(n * sizeof *num->data);
num->len = n;
können Sie dann sscanf()
oder strtol()
wiederholt Rufnummern zu speichern, in num->data
. Sie sollten überprüfen, um sicherzustellen, genau n
Zahlen sind in dieser Zeile.
Beachten Sie, dass Sie read_set()
auch auf andere Weise schreiben können: lesen Sie eine Zeile Zeichen für Zeichen, und analysieren Sie die Zahlen beim Lesen. Dies hat den Vorteil, dass die Daten nur einmal durchlaufen werden und kein großer Puffer benötigt wird, um die gesamte Eingabezeile im Speicher zu speichern, aber der Nachteil besteht darin, dass man selbst Low-Level-Stuff ausführt und Zeichen für Zeichen langsam liest.
Haben Sie die Aufmerksamkeit auf Linien zu zahlen, oder ist das nur eine Reihe von ganzen Zahlen nicht kommt? In Ihrem Beispiel sieht es so aus, als ob die ungeraden Zeilen Sequenznummern sind und die geraden Zeilen etwas anderes darstellen. –
david Ich muss auf die Zeilen achten. deshalb konnte ich es nicht tun. Ich muss aufhören, neue Werte am Ende jeder geraden Linie zu bekommen. Weil ich eine Struktur mit Attributen ID und Liste habe. jede ungerade Zeile ist eine ID und jede gerade Zeile ist eine Liste. Ich möchte eine Struktur mit 2 Zeilen von Daten füllen und zu einer anderen Struktur und füllen Sie sie mit weiteren 2 Zeilen von Daten etc ... – huhuhuuu
Lesen Sie eine ganze Zeile zu einer Zeit und dann nur als String analysieren –