-> Soigne la présentation du code (indentation) pour qu'il soit lisible facilement.
-> Passons à une lecture critique de ton code :
** sauvegarderNiveau() :
- Tu ouvres bien le fichier, mais lequel ? Le nom du fichier (file) est vide.
- Il ne suffit pas de changer un fscanf() par un fprintf(). Elles fonctionnent différemment :
Pour fscanf(), il faut lui dire où on veut que la fonction fscanf() mette la valeur lue (donc à quelle adresse) d'où le & (adresse de) qu'on trouve dans l'argument par exemple ici : fscanf(test, "%d",&n) .
Pour fprintf(), il faut lui dire directement la valeur à écrire, pas l'adresse de cette valeur (sauf pour les chaines). On doit alors avoir fprintf(fichier, "%d",niveau[j][i]) .
Tu ne connais pas bien les fonctions, on ne peut pas te le reprocher, tu débutes. Mais il est INDISPENSABLE, avant de les utiliser de lire leur documentation. Tu les utiliseras alors plus correctement et tu apprendras quelque chose
- Si on regarde la boucle d'écriture
cela signifie que le dernier élément écrit sera niveau[NB_BLOCS_HAUTEUR-1][NB_BLOCS_LARGEUR-1]. Or le tableau, tel qu'il est déclarer dans l'en-tête de la fonction est niveau[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR]. Ce n'est pas compatible, il y a permutation de NB_BLOCS_LARGEUR et NB_BLOCS_HAUTEUR. Si on considère que que l'en-tête de la fonction est correcte, il faut modifier la boucle.Code:
1
2 for(i = 0; i < NB_BLOCS_LARGEUR; i++) for(j = 0; j < NB_BLOCS_HAUTEUR; j++) fprintf(fichier, "%d", niveau[j][i]);
Par exemple :
Dans cet exemple, le nom du fichier a été passé en argument de la fonction.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 int sauvegarderNiveau(char const file[],int niveau[][NB_BLOCS_HAUTEUR]) { int i ; int j ; FILE* fichier = fopen(file,"r"); if(fichier == NULL) //**** toujours tester si l'ouverture est correcte { printf("Impossible d'ouvrir le fichier %s", file); return 0; } for(i = 0; i < NB_BLOCS_LARGEUR; i++) for(j = 0; j < NB_BLOCS_HAUTEUR; j++) fprintf(fichier, "%d", niveau[i][j]); fclose(fichier); return 1; } ..... if(sauvegarderNiveau("Monfichier", niveau)).... else ....
Il faut maintenant, avant d'envisager l'opération de chargement, tirer les conséquences de la manière dont on a construit le fichier de sauvegarde.
Les données sont écrites à la suite les unes des autres, sans séparateur entre elles (ce qui limite implicitement les valeurs possibles à écrire à 0, 1, ..., 8 ou 9. On ne peut écrire par exemple 10 parce que on ne pourra pas le différentier de l'écriture de deux nombres 1 et 0) et dans l'ordre (dans l'exemple que j'ai donné) suivant :** chargerNiveau()niveau[0][0], niveau[0][1], niveau[0][2],..., niveau[0][NB_BLOCS_HAUTEUR-1], niveau[1][0], niveau[1][1],..., niveau[1][NB_BLOCS_HAUTEUR-1], ... ......., niveau[NB_BLOCS_LARGEUR-1][NB_BLOCS_HAUTEUR-1]
- La boucle d'écriture est de toute façon fausse :
Si on regarde l'indice utilisé pour ligneFichier[] ,son maximum est (NB_BLOCS_LARGEUR-1)*NB_BLOCS_LARGEUR+ NB_BLOCS_HAUTEUR-1 alors qu'il doit être (NB_BLOCS_LARGEUR-1)*NB_BLOCS_HAUTEUR+ NB_BLOCS_HAUTEUR-1 == NB_BLOCS_LARGEUR*NB_BLOCS_HAUTEUR-1 .Code:
1
2
3
4
5
6 for(i = 0; i < NB_BLOCS_LARGEUR; i++) { for(j = 0; j < NB_BLOCS_HAUTEUR; j++) { niveau[j][i] = ligneFichier[(i * NB_BLOCS_LARGEUR) + j] - '0'; }
- On a à adapter la boucle d'assignation à l'ordre d'écriture dans le fichier.
Je ne discute pas à partir de l'expression que tu as donnée dans le code de sauvegarderNiveau() pour écrire les données puisqu'elle est fausse et doit être changée, mais je pars de celle du code de sauvegarderNiveau() donné en exemple dans ce post :
et l'indice de ligneFichier varie commeCode:
1
2 for(i = 0; i < NB_BLOCS_LARGEUR; i++) for(j = 0; j < NB_BLOCS_HAUTEUR; j++)niveau[i][j] = ligneFichier[(i * NB_BLOCS_HAUTEUR) + j] - '0';
et ceux de niveau en0, 1,...NB_BLOCS_HAUTEUR-1,NB_BLOCS_HAUTEUR, NB_BLOCS_HAUTEUR+1,....
ce qui correspond bien à l'ordre d'écriture dans le fichier.[0][0], [0][1], [0][2], [0][NB_BLOCS_HAUTEUR-1], [1][0], [1][1],...