A voir également:
- Matrice de Caractères Programmation en C
- Caractères ascii - Guide
- Caractères spéciaux clavier azerty - Guide
- Application de programmation - Guide
- Caractères spéciaux - Guide
- Exemple de mot de passe à 8 caractères - Guide
1 réponse
Hxyp
Messages postés
401
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
27 avril 2014
54
Modifié par Hxyp le 26/04/2012 à 21:46
Modifié par Hxyp le 26/04/2012 à 21:46
Bonjour,
Il y a un problème important ici :
qui devrait être
tab[j][i]=x;
tab[j][i]=y;
seulement comme vous pouvez le constater vous donnez la valeur de x à l'emplacement [j][i] puis vous l'écrasez en lui donnant la valeur de y. y ne devrait-il pas être à i+1 ?
Pensez à utiliser rewind pour revenir au début du fichier plutôt que de le fermer et le réouvrir pour faire la même chose.
Enfin d'après le format du fichier et ce que j'ai compris :
si le "c" n'est toujours que d'un chiffre vous pouvez directement utiliser un seul tableau de char pour stocker les trois variables :
Ça fait un tab[nbarc][3] où du contenu du fichier
x = tab[i][0] y = tab[i][1] c = tab[i][2]
...
le c en [i][2] étant un chiffre récupéré dans un char est passé en entier avec le -'0' ce qui vous permet de l'utiliser comme si c'était un int. Cependant ça reste limité à la taille du char et si le char fait 8bits au minimum ce qui doit être le cas, l'entier max ne peux dépasser 255 en décimal. Edit : 127, car le tableau de char n'est pas unsigned.
Il y a un problème important ici :
strcpy(&tab[j][i], &x); strcpy(&tab[j][i], &y);
qui devrait être
tab[j][i]=x;
tab[j][i]=y;
seulement comme vous pouvez le constater vous donnez la valeur de x à l'emplacement [j][i] puis vous l'écrasez en lui donnant la valeur de y. y ne devrait-il pas être à i+1 ?
Pensez à utiliser rewind pour revenir au début du fichier plutôt que de le fermer et le réouvrir pour faire la même chose.
Enfin d'après le format du fichier et ce que j'ai compris :
x y c ------ E e 8 E a 5 E f 3 a b 9 a c 7 b f 8
si le "c" n'est toujours que d'un chiffre vous pouvez directement utiliser un seul tableau de char pour stocker les trois variables :
#include <stdio.h> #include <stdlib.h> int main(void){ int i,nbarc; char t[3],**tab; FILE *f; f=fopen("john.txt","r"); if(f){ nbarc=0; while(fscanf(f,"%c %c %c\n",&t[0],&t[1],&t[2])!=EOF){ if(t[0]!='-') nbarc++; printf("%c %c %c\n",t[0],t[1],t[2]); } tab=malloc(sizeof(char*)*nbarc); if(tab) for(i=0;i<nbarc;i++) { tab[i]=malloc(sizeof(char)*3); if(!tab[i]) exit(1); } else exit(1); rewind(f); /* recup dans tab */ for(i=0;i<nbarc;i++){ fscanf(f,"%c %c %c\n",&tab[i][0],&tab[i][1],&tab[i][2]); tab[i][2]-='0'; /* pour la convert du chiffre en "int" */ } /* affiche tab */ for(i=0;i<nbarc;i++) printf("x:%c y:%c c:%d\n",tab[i][0],tab[i][1],tab[i][2]); fclose(f); /* free */ for(i=0;i<nbarc;i++) free(tab[i]); free(tab); } else exit(1); return 0; }
Ça fait un tab[nbarc][3] où du contenu du fichier
x = tab[i][0] y = tab[i][1] c = tab[i][2]
...
le c en [i][2] étant un chiffre récupéré dans un char est passé en entier avec le -'0' ce qui vous permet de l'utiliser comme si c'était un int. Cependant ça reste limité à la taille du char et si le char fait 8bits au minimum ce qui doit être le cas, l'entier max ne peux dépasser 255 en décimal. Edit : 127, car le tableau de char n'est pas unsigned.
27 avril 2012 à 00:15
J'ai pu voir mon erreur, je voulais effectivement l'écrire au rang i+1.C'est tout à fait ce vous avez écrit ensuite.
J'aimerais cependant conserver la partie entière des nombres présents dans le fichier et non les considérer comme étant des caractères, car par la suite ils seront modifiés. Je vais donc créer un tableau à une dimension contenant ces valeurs qui sont en quelques sorte des poids d'arc, pour ensuite les mettre en relation avec le tableau de caractères.
Merci
Bonne soirée
Cordialement
Macmat