Stoker des nombres provenant d'un fichier dans un tableau
pocky
-
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
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?
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:
- Stoker des nombres provenant d'un fichier dans un tableau
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier bin - Guide
- Tableau word - Guide
- Trier un tableau excel - Guide
2 réponses
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,
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