[C] Convertir un tableau char en long

Fermé
Sylvain Wells - 6 avril 2009 à 11:03
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 7 avril 2009 à 15:30
Bonjour,
Je travaille sur un petit jeu en C et j'ai besoin de créer un tableau de scores. J'arrive facilement à convertir le score (long) obtenu en char[] et à l'enregistrer dans un .txt, mais lorsque je veux récupérer les scores pour les classer je ne parviens pas à les reconvertir en long.
Quelqu'un aurait-il une idée pour y parvenir ?

5 réponses

squall289 Messages postés 98 Date d'inscription mardi 31 mars 2009 Statut Membre Dernière intervention 29 mai 2009 13
6 avril 2009 à 11:16
Le langage C doit pouvoir convertir un long en chaine de caractère nativement, puisque tout nombre est aussi une chaine de caractère. par contre une chaine de caractère n'est pas forcément un nombre.
Par exemple : 1600 est un int, et peut se convertir simplement en char par '1600'.
Par contre convertir 'mille six cent' en long c'est impossible (enfin si, mais pas directement par le langage).
c'est donc normal que tu n'arrives pas à forcer la conversion.
Il faut donc que tu récupères les scores en long dans ton programme, que tu les stockes et que tu les ressortes après.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
6 avril 2009 à 12:04
Salut,
tout nombre est aussi une chaine de caractère. par contre une chaine de caractère n'est pas forcément un nombre.
Euh non. Ce sont deux éléments qui n'ont strictement rien à voir. L'un est un long, l'autre est un tableau de char...
0
squall289 Messages postés 98 Date d'inscription mardi 31 mars 2009 Statut Membre Dernière intervention 29 mai 2009 13 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
6 avril 2009 à 14:45
Je disais ça pour lui faire comprendre pourquoi le cast ne fonctionnait pas dans ce sens alors qu'il fonctionne dans l'autre.
Dans le sens ou char '12' fonctionne alors que long 'douze' ne fonctionne pas.. Bref Passons, le but est quand même de donner une solution à la question posé tout en expliquant pourquoi cela ne fonctionne pas.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > squall289 Messages postés 98 Date d'inscription mardi 31 mars 2009 Statut Membre Dernière intervention 29 mai 2009
6 avril 2009 à 15:11
Oui, mais sauf que le cast ne fonctionne pas dans l'autre sens non plus.
La chaîne de caractères "12" n'a aucun lien (ni de près ni de loin) avec le nombre 12.

e but est quand même de donner une solution à la question posé tout en expliquant pourquoi cela ne fonctionne pas
Oui je suis d'accord. Mais à condition de donner les bonnes explications ^^. Pour la solution, les postes #3 et #4 sont là (strtol, atol, etc).
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
6 avril 2009 à 12:06
Salut,
Donne un exemple de ce que tu as en long et de ce que tu as dans ton tableau de char qu'on puisse être sûr de parler de la même chose.
Sinon pour convertir une chaîne en long, tu peux utiliser strtol (ou à la limite atol et sscanf, mais moins bien).
Cdlt
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
6 avril 2009 à 12:11
Salut.
regarde du coté des fonctions scanf() (scanf, sscanf et fscanf) C'est une des meilleur méthode.
Sinon, il y a la fonction atoi() ou atol().
0
Sylvain Wells
7 avril 2009 à 11:52
Par exemple :
J'ai un long égal à 12. Pour le stocker, je le convertit en chaîne de caractères pour l'enregistrer ; dans mon .txt, il y a donc écrit 12. mais comme c'est une chaîne de caractères, je ne peux pas la convertir en long, car 12 n'est plus une valeur mais un "mot", en quelque sorte.

L'idéal serait bien sûr de stocker mon long en tant que long, mais je ne vois pas comment faire...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
7 avril 2009 à 12:02
Dans ton fichier, tu peux lire avec fscanf(fp,"%ld",&nb);
Ou alors si tu as ta chaîne, tu peux convertir avec atol ou strtol.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
7 avril 2009 à 12:17
Salut.
Fiddy se répète (il est gentil), les solutions ont été donné, rien à dire de plus.
Pour enregistrer un entier directement, il faut déjà savoir ce qu'il y a d'autre dans ton fichier.
s'il n'y a que des entiers, enregistrés de façon séquentielle toujours identique, tu peux alors utiliser l'écriture dans un fichier au format binaire.
Si ma mémoire est bonne :
int f=open("toto.bin",O_WRONLY);
long l;
...
write(f,&l,sizeof(l));
Et pour lire
int f=open("toto.bin",O_RDONLY);
long l;
read(f,&l,sizeof(l));
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
7 avril 2009 à 12:43
Merci pour le compliment lol.
Par contre, tu veux sûrement parler de fwrite et fread au lieu de write et read ^^.

//écriture
fwrite(&l,sizeof l,1,f);

//lecture
fread(&l,sizeof l,1,f);
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
7 avril 2009 à 14:09
Non, en conjonction avec open() (et non fopen()) c'est read() et write() qu'il faut utiliser.
Ce soit les fonction générique d'écriture dans un flux.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023
7 avril 2009 à 14:22
Dommage d'utiliser des fonctions non standards alors fopen, fwrite et fread le sont...
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
7 avril 2009 à 15:03
ça dépend de ce qu'on appel standard...
D'après les pages de manuel, fread(), conformité : ANSI X3.159-1989 (``ANSI C'')
et read(), conformité : SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3
POSIX, c'est pas mal comme standard, enfin, je ne sais pas trop comment s'arrangent ces différentes couches.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023
7 avril 2009 à 15:30
Ce que l'on appelle standard c'est lorsque la fonction est issue des 24 headers ISO C.
unistd.h n'en faisant pas parti, les fonctions définies dedans ne sont pas standard ISO C.

Vaut mieux choisir une fonction standard C qu'une fonction POSIX (sous réserve d'avoir le choix bien sûr).
0