Stoker des nombres provenant d'un fichier dans un tableau

Fermé
pocky - Modifié par pocky le 24/09/2013 à 19:53
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 - 25 sept. 2013 à 14:15
Bonjour,
J'ai un fichier.text contenant plusieurs lignes, avec un nombre à chaque ligne comme par exemple :
125689
558953
488569
463697

Je ne trouve pas comment stocker chacun de ces nombres dans une case d'un tableau dans mon programme en C. En ouvrant le fichier avec un fopen, je ne sais que stoker UN chiffre par case avec fgetc ou fgets, or j'aimerai stocker le nombre entier dans une seule case du tableau. Comment faire s'il vous plaît?
A voir également:

2 réponses

juliencolin54 Messages postés 217 Date d'inscription dimanche 22 juillet 2012 Statut Membre Dernière intervention 1 octobre 2013 55
25 sept. 2013 à 08:47
Bonjour,

Si ton tableau est déjà alloué, tu peux simplement fait avec un incrément i à chaque ligne
tab[i] = atoi(line); 

Et sii tu ne connais pas le nombre d'éléments qu'il y aura dans ton fichier, le plus adapté est une liste chaînée.

Cdlt,
0
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
Modifié par [Dal] le 25/09/2013 à 14:00
Salut pocky,

1.

Pour le stockage lui-même, tu peux utiliser une des méthodes mentionnées par juliencolin54.

2.

Pour ton problème que tu exprimes ainsi :

En ouvrant le fichier avec un fopen, je ne sais que stoker UN chiffre par case avec fgetc ou fgets, or j'aimerai stocker le nombre entier dans une seule case du tableau. Comment faire s'il vous plaît?

C'est normal qu'avec fgetc tu obtiennes un seul caractère (qui représente un chiffre de la ligne contenant un nombre).

Avec fgets, c'est anormal, sauf si tu ne lui demandes de ne lire qu'un seul caractère.

http://www.cplusplus.com/reference/cstdio/fgets/

Peux-tu nous montrer ton code avec fgets ?

Bien sûr, il te faut une chaîne de caractères C allouée avec une taille suffisante pour stocker la ligne de caractères (avant de la convertir en entier pour la stocker dans un tableau d'entiers - à ce propos, je te recommande d'utiliser plutôt strtol, au lieu de atoi, car elle permet un contrôle d'erreurs).

3.

La difficulté est ensuite, en C, que la chaîne passée en paramètre de fgets doit être allouée avec une certaine taille, et que tu peux ne pas connaître à l'avance la taille maximale, en caractères (y compris '\n' et le caractère null) que vont faire tes lignes.

Si tu sais, de façon certaine, que toutes les lignes vont avoir une certaine taille maximale, tout va bien.

Dans le cas contraire, tu risques de tronquer ta lecture, et d'obtenir de faux résultats.

Si tu te trouves dans ce dernier cas, une solution alternative est d'allouer une taille qui devrait être rarement dépassée, de lire caractères par caractères chaque ligne (donc avec fgetc) et d'augmenter la taille allouée lorsque tu es sur le point de la dépasser (par exemple, tu la doubles). C'est plus compliqué, mais cela marche quelque soit la taille de tes lignes.

Ce problème peut sembler théorique dans ton cas, puisque tu lis des entiers, et que strtol va te retourner des long int qui auront une taille maximale définie par le système pour lequel ton programme va être compilé. Mais justement, si la taille du tampon est suffisante, strtol te dira si la conversion a pu se faire, ou elle n'as n'a pas pu se faire en raison d'un dépassement de capacité.

Cette capacité est définie dans limits.h par LONG_MAX et LONG_MIN.

Une solution raisonnable à ton problème me semble donc d'aligner ta taille de chaîne passée à fgets sur quelques caractères de plus que ceux nécessaires à la représentation de ces valeurs.

Ainsi, tu seras certain de traiter le problème du dépassement de capacité.


Dal
0
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
25 sept. 2013 à 14:15
Tu peux aussi utiliser strtoul, si ce ne sont que des entiers positifs, pour augmenter la capacité de traitement.

Voire strtoll ou strtoull si tu veux/peux faire autre chose que du C89.


Dal
0