Erreur procédure chargement fichier
Résolu
Franck7511
Messages postés
15853
Statut
Membre
-
fiddy Messages postés 11653 Statut Contributeur -
fiddy Messages postés 11653 Statut Contributeur -
Bonjour,
J'ai codé ces fonctions en C :
Il sert à sauvegarder (cette étape marche correctement !) et à charger (là moins !) une grille de démineur.
En gros, la sauvegarde est un fichier texte de la forme :
Quand je charge cette sauvegarde, j'ai bien accès aux 4 premiers paramètres, mais la grille est complètement altérée...
Les lignes 77-80 sont problématiques. En remplacant par
j'ai bien "ce qu'il doit se passer" : les cases sont bien toutes remplies par des "1".
Quelqu'un aurait une idée ?
Merci beaucoup !
PS : Je ferai un contrôle des valeurs de retour (fichier correctement ouvert, de la bonne forme, etc...) ultérieurement !
J'ai codé ces fonctions en C :
void sauvegarde (int ** grille, char ** grille_demineur, int longueur, int hauteur, int temps, char fichier[128]) { FILE * fp; int i, j; fp = fopen(fichier, "w+"); fprintf(fp, "%d", longueur); fputc('\n', fp); fprintf(fp, "%d", hauteur); fputc('\n', fp); fprintf(fp, "%d", temps); fputc('\n', fp); for (i = 0; i<hauteur; i++) { for (j = 0; j < longueur; j++) { fputc(grille_demineur[i][j], fp); } } fputc('\n', fp); for (i = 0; i<hauteur; i++) { for (j = 0; j < longueur; j++) { fputc(grille[i][j]+48, fp); } } fclose(fp); } void chargement1(int* longueur, int* hauteur, int* temps, char fichier[128]) { FILE * fp; fp = fopen(fichier, "r"); char str_longueur[16]; char str_hauteur[16]; char str_temps[16]; fgets(str_longueur, 16, fp); *longueur = atoi(str_longueur); fgets(str_hauteur, 16, fp); *hauteur = atoi(str_hauteur); fgets(str_temps, 16, fp); *temps = atoi(str_temps); fclose(fp); } void chargement2(int** grille, char ** grille_demineur, int longueur, int hauteur, char fichier[128]) { FILE * fp; char buffer[16]; char str_grillechar[longueur*hauteur +1]; char str_grille[longueur*hauteur +1]; int i; char str[3]; fp = fopen(fichier, "r"); fgets(buffer, 16, fp); fgets(buffer, 16, fp); fgets(buffer, 16, fp); fgets(str_grillechar, longueur*hauteur +1, fp); for (i = 0; i < longueur*hauteur; i++) { grille_demineur[i/longueur][i%longueur] = str_grillechar[i]; } fgets(str_grille, (longueur*hauteur) +1, fp); for (i = 0; i < longueur*hauteur; i++) { grille[i/longueur][i%longueur] = str_grille[i]-48; } fclose(fp); }
Il sert à sauvegarder (cette étape marche correctement !) et à charger (là moins !) une grille de démineur.
En gros, la sauvegarde est un fichier texte de la forme :
longueurElle est correctement enregistrée !
hauteur
temps
matrice grille_demineur
matrice grille
Quand je charge cette sauvegarde, j'ai bien accès aux 4 premiers paramètres, mais la grille est complètement altérée...
Les lignes 77-80 sont problématiques. En remplacant par
grille[i/longueur][i%longueur] = 1;
j'ai bien "ce qu'il doit se passer" : les cases sont bien toutes remplies par des "1".
Quelqu'un aurait une idée ?
Merci beaucoup !
PS : Je ferai un contrôle des valeurs de retour (fichier correctement ouvert, de la bonne forme, etc...) ultérieurement !
A voir également:
- Erreur procédure chargement fichier
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
3 réponses
Résolu : On devait écrire
Car il y a le caractère '\0' et le caractère '\n' !
char str_grillechar[longueur*hauteur +2];
Car il y a le caractère '\0' et le caractère '\n' !
Bonjour,
Bravo. Tu as trouvé tout seul. Je te joins les explications si cela t'intéresse :
Le fgets stocke le '\n' lorsqu'il y a suffisamment de place, ce qui est le cas ici. Du coup, un coup ton fgets() récupère le début de la ligne (sans le '\n') et le fgets() suivant récupère uniquement le '\n', ce qui pose problème lorsque tu recopies la ligne.
Sinon, des remarques sur ton code (hors la vérification des codes retours, etc. ;-)) :
atoi() est obsolète. Utilise plutôt strtol().
Dans ta fonction chargement2(), tu peux faire beaucoup plus rapide.
for (i = 0; i < longueur*hauteur; i++)
{
grille_demineur[i/longueur][i%longueur] = str_grillechar[i];
}
fgets(str_grille, (longueur*hauteur) +1, fp);
for (i = 0; i < longueur*hauteur; i++)
{
grille[i/longueur][i%longueur] = str_grille[i]-48;
}
Tu peux simplement faire :
De même pour la fonction de sauvegarde.
Cdlt,
Bravo. Tu as trouvé tout seul. Je te joins les explications si cela t'intéresse :
Le fgets stocke le '\n' lorsqu'il y a suffisamment de place, ce qui est le cas ici. Du coup, un coup ton fgets() récupère le début de la ligne (sans le '\n') et le fgets() suivant récupère uniquement le '\n', ce qui pose problème lorsque tu recopies la ligne.
Sinon, des remarques sur ton code (hors la vérification des codes retours, etc. ;-)) :
atoi() est obsolète. Utilise plutôt strtol().
Dans ta fonction chargement2(), tu peux faire beaucoup plus rapide.
for (i = 0; i < longueur*hauteur; i++)
{
grille_demineur[i/longueur][i%longueur] = str_grillechar[i];
}
fgets(str_grille, (longueur*hauteur) +1, fp);
for (i = 0; i < longueur*hauteur; i++)
{
grille[i/longueur][i%longueur] = str_grille[i]-48;
}
Tu peux simplement faire :
fgets((char*)grille_demineur, longueur*hauteur, fp); fgetc(fp); fgets((char*)grille, longueur*hauteur, fp); fgetc(fp);
De même pour la fonction de sauvegarde.
Cdlt,