Erreur procédure chargement fichier [Résolu/Fermé]
Signaler
Franck7511
fiddy
- Messages postés
- 14296
- Date d'inscription
- jeudi 24 décembre 2009
- Statut
- Membre
- Dernière intervention
- 10 août 2017
fiddy
- Messages postés
- 11066
- Date d'inscription
- samedi 5 mai 2007
- Statut
- Contributeur
- Dernière intervention
- 18 octobre 2016
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
- Erreur procédure chargement fichier ✓ - Forum - C
- Erreur de chargement, fichier ctccw32.dll int ✓ - Forum - Virus / Sécurité
- Erreur de chargement d'un fichier système. ✓ - Forum - Windows
- XP erreur chargement fichier ✓ - Forum - Windows
- Erreur de chargement d'un fichier dans un tableau ✓ - Forum - C
3 réponses
Franck7511
- Messages postés
- 14296
- Date d'inscription
- jeudi 24 décembre 2009
- Statut
- Membre
- Dernière intervention
- 10 août 2017
up ! :)
Franck7511
- Messages postés
- 14296
- Date d'inscription
- jeudi 24 décembre 2009
- Statut
- Membre
- Dernière intervention
- 10 août 2017
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' !
fiddy
- Messages postés
- 11066
- Date d'inscription
- samedi 5 mai 2007
- Statut
- Contributeur
- Dernière intervention
- 18 octobre 2016
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,