[C] Convertir un tableau char en long

Sylvain Wells -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
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 ?
A voir également:

5 réponses

squall289 Messages postés 100 Date d'inscription   Statut Membre Dernière intervention   13
 
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   Statut Contributeur Dernière intervention   1 846
 
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 100 Date d'inscription   Statut Membre Dernière intervention   13 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
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   Statut Contributeur Dernière intervention   1 846 > squall289 Messages postés 100 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Contributeur Dernière intervention   1 299
 
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
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Contributeur Dernière intervention   1 299
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Contributeur Dernière intervention   1 299 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
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   Statut Contributeur Dernière intervention   1 846 > Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention  
 
Dommage d'utiliser des fonctions non standards alors fopen, fwrite et fread le sont...
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
ç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   Statut Contributeur Dernière intervention   1 846 > Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention  
 
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