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 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 - 25 sept. 2013 à 14:15
[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 - 25 sept. 2013 à 14:15
A voir également:
- Stoker des nombres provenant d'un fichier dans un tableau
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Tableau croisé dynamique - Guide
- Fichier rar - Guide
- Ouvrir un fichier .bin - Guide
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
25 sept. 2013 à 08:47
Bonjour,
Si ton tableau est déjà alloué, tu peux simplement fait avec un incrément i à chaque ligne
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,
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,
[Dal]
Messages postés
6200
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 janvier 2025
1 097
Modifié par [Dal] le 25/09/2013 à 14:00
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
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
[Dal]
Messages postés
6200
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 janvier 2025
1 097
25 sept. 2013 à 14:15
25 sept. 2013 à 14:15