Ich würde das Programm in verschiedene Aufgaben aufteilen.
Der erste Schritt besteht darin, zwei Zeilen lesen zu können: die erste Zeile, die die Anzahl der zu lesenden Zahlen angibt, und dann die zweite Zeile, in der die eigentlichen Zahlen zu lesen sind. Dazu braucht man eine Funktion wie read_set
nützlich sein könnte. Sie sollte in der Lage sein, die gelesenen Zahlen zurückzugeben und das Ende der Datei sowie Fehler zu melden. Dazu können wir eine Datenstruktur definieren, wie z.B.:
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 ordnet Speicher für num->data
und setzen num->len
auf den richtigen Wert. Bei Erfolg wird 0 zurückgegeben, andernfalls eine Reihe von Fehlerbedingungen. Wir könnten uns etwas einfallen lassen und eine enum
für den Rückgabestatus später. Für den Moment sagen wir, dass 0 = Erfolg, 1 = Ende der Datei und alles andere 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 die Umsetzung read_set()
: Er muss zwei Zeilen lesen. Es gibt viele Implementierungen des Lesens einer vollständigen Zeile in C Sie können also eine beliebige davon verwenden und zuerst eine Zeile lesen, dann sscanf()
/ strtoul()
für eine Zahl (prüfen Sie den Rückgabewert!). Sobald Sie die Anzahl der Zahlen haben, n
können Sie die nächste Zeile im Speicher lesen, und tun:
num->data = malloc(n * sizeof *num->data);
num->len = n;
Sie können dann wiederholt sscanf()
ou strtol()
zum Speichern von Zahlen in num->data
. Sie sollten Kontrollen durchführen, um sicherzustellen, dass genau n
Zahlen sind auf dieser Linie.
Beachten Sie, dass Sie schreiben können read_set()
auch auf andere Weise: Lesen Sie eine Zeile Zeichen für Zeichen, und analysieren Sie die Zahlen beim Lesen. Dies hat den Vorteil, dass Sie die Daten nur einmal durchgehen und keinen großen Puffer benötigen, um die gesamte Eingabezeile im Speicher abzulegen, aber der Nachteil ist, dass Sie selbst Low-Level-Sachen machen und das Lesen der Daten Zeichen für Zeichen langsam sein kann.
1 Stimmen
Müssen Sie auf Linien achten, oder handelt es sich nur um eine Reihe von Ganzzahlen, die eingehen? In Ihrem Beispiel sieht es so aus, als ob die ungeraden Zeilen Sequenznummern sind und die geraden Zeilen etwas anderes darstellen.
0 Stimmen
David Ich muss auf die Linien achten. Deshalb konnte ich es nicht tun. Ich muss aufhören, am Ende jeder geraden Zeile neue Werte zu erhalten. Denn ich habe eine Struktur mit den Attributen id und list. Jede ungerade Zeile ist eine id und jede gerade Zeile ist eine list. Ich möchte eine Struktur mit 2 Zeilen von Daten füllen und zu einer anderen Struktur wechseln und diese mit weiteren 2 Zeilen von Daten füllen usw.
0 Stimmen
Lesen Sie eine ganze Zeile auf einmal ein und analysieren Sie sie dann einfach als String