Se connecter / S'enregistrer
Votre question

C : la fonction de chargement ne marche pas

Tags :
  • Programmation
Dernière réponse : dans Programmation
2 Mai 2007 17:04:58

Bonjours,
je cherche a écrire une fonction qui chargerait le contenu d'un fichier texte dans un tableau a double entrée [15][15].
toutefois, je n'arrive pas a la faire et jusqu'a présent personne n'a su me dire ce qui était faux.
elle charge un fichier dont les info sont mise a la suite sans passer a la ligne.
voici cette fameuse foutue fonction :
  1. void chargerCarte(char tableauJeu[][NB_CASE])
  2. {
  3. FILE *fichier = NULL;
  4. long i=0,j=0;
  5.  
  6. fichier = fopen("niveau.txt", "r");
  7.  
  8. if (fichier != NULL)
  9. {
  10. do
  11. {
  12. printf("[%ld][%ld] ", i, j);//m'as parmis de voir que le tableau était corectement parcouru
  13. if(j>13)//j ne doit pas dépasser 14 (15eme case)
  14. {
  15. j=0;
  16. i++;
  17. }
  18. tableauJeu[i][j] = fgetc(fichier);
  19. //printf("%c", tableauJeu[i][j]);
  20. j++;
  21.  
  22. }while(tableauJeu[i][j] != EOF && i<15);
  23. }


et voici, ce qui pourra vous aider la fonction d'enregistrement, qui elle est fonctionnelle (vérifié avec le .txt ;)  )
  1. void sauvegarderCarte(char tableauJeu[][NB_CASE])
  2. {
  3. FILE *fichier = NULL;
  4. long i,j;
  5.  
  6. fichier = fopen("niveau.txt", "w");
  7.  
  8. if (fichier != NULL)//si le fichier s'ouvre corectement
  9. {
  10. for(i=0;i<NB_CASE;i++)//double boucle
  11. {
  12. for(j=0;j<NB_CASE;j++)
  13. {
  14. fprintf(fichier, "%ld", tableauJeu[j][i]);//on copie le contenu du tableau dans un fichier texte
  15. }
  16. }
  17. fclose(fichier);
  18. }
  19. }


voila je vous remerçie d'avance de votre aide...

Autres pages sur : fonction chargement marche

2 Mai 2007 18:02:22

bonjour,
lorsque tu vérifies ce que tu as dans ton fichier, tu as les bonnes valeurs?

ton tableau est un tableau de caractères (char tableauJeu)
ce que tu ecrit dans le fichier est un long ("%ld")

un 0 en char par exemple correspond à 48 en le convertissant en long, et c'est 48 qui sera écrit dans ton fichier (et du coup sera lu comme '4')
2 Mai 2007 18:28:29

...
bon de 1), on voit tou de suite les gents compétent...

alors oui, j'en suis absolument sur, les fonctions d'enregistrements marchent tout à fait corectement, les valeures inscrites sont les bonnes, elle varie de 0 a 6 (je les manipule avec une énumération hein ! )

il s'agit d'un double tableau de char en effet...
la solution serait de l'enregistrer sous forme de %d pluto que %ld ?
pourtant j'ai toujours manipulé des %ld avec mes tableaux de char...

ok ben merci beaucoup j'essaye ça et je te dis :) 
Contenus similaires
2 Mai 2007 18:51:28

il semblerait que tu ait réglé un problème, mais il y a semblent-il a la fin du chargement :s
citation du niveau.txt
Citation :
22000000000000000000000000
00000000000000000000000000000000
00000000200000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
000000000000000000000000000000000000222

citation du stdout a ce niveau :
  1. tableauJeu[i][j] = fgetc(fichier);
  2. printf("%c", tableauJeu[i][j]);

Citation :
22000000000000000000000000
00000000000000000000000000000000
00000000200000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
0000000000000000000000000


hé oui, la fin est bouffé :s
au cas ça ne se voit pas dans le post, je l'est bien vu en faisant le copier coller sur un seule ligne...
mais ceci provoque des problème d'affichage, donc j'en passe...


je ne comprend pas pourquoi, j'ai bien vérifié que tout le tableau était parcouru, et qu'il finissait @ [14][14] ...
sachant que la valeur NB_CASE vaut 15...

comprend pas :/ 

tu saurais m'expliquer ce mystere :D  ?
2 Mai 2007 19:03:17

si NB_CASE vaut 15, pourquoi tu testes si j<13 ??
d'ailleurs:
  1. // supposant on est à 14
  2. if(j>13)//j ne doit pas dépasser 14 (15eme case)
  3. {
  4. j=0;
  5. i++;
  6. }
  7. // la tu te retrouves à j = 0
  8. tableauJeu[i][j] = fgetc(fichier);
  9. // donc 14 n'est jamais remplie


et enfin, la condition du while est mauvaise, car i est incrémenté avant l'initialisation du tableau, donc tu peux toucher le [15][x] avant de sortir
6 Mai 2007 19:24:34

en fait, si je met j>14, j monte jusqu'a 15... hors 15 n'existe pas dans le tableau, vu qu'il il a 15 case on est en C donc la case 0 compte...

c'est surement du a ta 2ème remarque...je vais essayer de corriger ça, merci :) 
7 Mai 2007 10:49:06

Si tu veux lire des caractères : pourquoi ta fonction de sauvegarde écrit des entiers ?

1. void sauvegarderCarte(char tableauJeu[][NB_CASE])
2. {
3. FILE *fichier = NULL;
4. long i,j;
5.
6. fichier = fopen("niveau.txt", "w" );
7.
8. if (fichier != NULL)//si le fichier s'ouvre corectement
9. {
10. for(i=0;i<NB_CASE;i++)//double boucle
11. {
12. for(j=0;j<NB_CASE;j++)
13. {
14. fprintf(fichier, "%c", tableauJeu[j]);//on copie le contenu du tableau dans un fichier texte
15. }
16. }
17. fclose(fichier);
18. }
19. }

et la fonction de lecture symétrique :

1. void chargerCarte(char tableauJeu[][NB_CASE])
2. {
3. FILE *fichier = NULL;
4. long i,j;
5.
6. fichier = fopen("niveau.txt", "r" );
7.
8. if (fichier != NULL)//si le fichier s'ouvre corectement
9. {
10. for(i=0;i<NB_CASE;i++)//double boucle
11. {
12. for(j=0;j<NB_CASE;j++)
13. {
14. tableauJeu[j] = fgetc(fichier);
15. }
16. }
17. fclose(fichier);
18. }
19. }
12 Mai 2007 10:48:55

désolé du retard

comme ça des caractere ?
ma fonction de sauvegarde doit écrire des chiffre de 0 a 5.
ce sont des caracteres ?

je ne comprend plus très bien :s

qu'est ce que je doit enregister alors ?
des %ld ? des %d ? des %c ?
que puis-je manier avec un tabeau de type char ?

merci de vos lumières :) 
12 Mai 2007 11:44:41

alors?
peu importe comment tu enregistre, prends bien garde au typage de données.

tu as un tableau (de tableau) de caractères.
si tu fais 1 %d, tu enregistrera le code ASCII du caractere.
'0' = 48 en ASCII
'1' = 49 en ASCII
'2' = 50 en ASCII
avec un %c , tu enregistrera le caractere demandé.



il te faut juste être cohérent.
13 Mai 2007 15:42:12

ok, donc moi il faut que j'enregistre des %c, sinon mon tableau sensé contenir des 0,1,2... va contenir des 50 et l'ordi va plus me comprendre :D 

donc si j'ai bien compris :

fonction d'enregistrement : %c
fonction chargement : fgets
=> on obtient des 0,1,2...dans mon double tableau.

c'est bien ça (désolé d'insister mais en temps que newbie je veut etre sur :)  ) ?
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS