Je casserais le programme dans différentes tâches.
La première étape consiste à être capable de lire une paire de lignes, la première ligne qui vous indique le nombre de nombres à lire, puis la seconde ligne pour lire les nombres réels. Pour cela, une fonction appelée quelque chose comme read_set
pourrait être utile. Il devrait être capable de renvoyer les numéros lus, et signaler la fin du fichier ainsi que les erreurs. Pour cela, nous pouvons définir une structure de données telles que:
struct numbers {
long *data; /* or choose a type depending upon your needs */
size_t len;
};
et nous pouvons déclarer notre fonction avec le prototype:
int read_set(FILE *fp, struct numbers *num);
La fonction allouer de la mémoire pour num->data
et mettre num->len
à la valeur correcte. Il renvoie 0 pour le succès, et un ensemble de conditions d'erreur sinon. Nous pourrions avoir envie et utiliser un enum
pour les statuts de retour plus tard. Pour l'instant, disons que 0 = succès, 1 = fin du fichier, et tout le reste est une erreur.
L'appelant appelle alors read_set()
dans une boucle:
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 */
}
Pour la mise en œuvre read_set()
: il doit lire deux lignes. Il ya beaucoup de implementations of reading a full line in C, donc vous pouvez utiliser l'un d'entre eux, et lire une ligne d'abord, puis sscanf()
/strtoul()
pour un nombre (vérifier sa valeur de retour!). Une fois que vous avez le nombre de numéros, n
, vous pouvez lire la ligne suivante dans la mémoire, et à faire:
num->data = malloc(n * sizeof *num->data);
num->len = n;
Vous pouvez ensuite appeler à plusieurs reprises sscanf()
ou strtol()
pour enregistrer les numéros dans num->data
. Vous devriez mettre en vérifications pour vous assurer que les numéros n
sont exactement sur cette ligne.
Notez que vous pouvez également écrire read_set()
d'une autre manière: lisez une ligne caractère par caractère et analysez les nombres au fur et à mesure que vous les lisez. Cela a l'avantage de ne parcourir qu'une seule fois les données et de ne pas avoir besoin d'un gros tampon pour stocker toute la ligne d'entrée en mémoire, mais l'inconvénient est de faire des choses de bas niveau et de lire les données caractère par caractère.
Avez-vous prêter attention aux lignes, ou est-ce juste une série d'entiers qui viennent? Dans votre exemple, il semble que les lignes impaires sont des numéros de séquence et les lignes paires représentent quelque chose d'autre. –
david Je dois faire attention aux lignes. C'est pourquoi je ne pouvais pas le faire. Je dois arrêter d'obtenir de nouvelles valeurs à la fin de chaque ligne paire. Parce que j'ai une structure avec les attributs id et list. chaque ligne impaire est un identifiant et chaque ligne paire est une liste. Je veux remplir une structure avec 2 lignes de données et passer à une autre structure et le remplir avec 2 autres lignes de données etc ... – huhuhuuu
Lire dans une ligne entière à la fois, puis juste l'analyser comme une chaîne –