Erreur procédure chargement fichier [Résolu/Fermé]

Signaler
Messages postés
14296
Date d'inscription
jeudi 24 décembre 2009
Statut
Membre
Dernière intervention
10 août 2017
-
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 :

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 :
longueur
hauteur
temps
matrice grille_demineur
matrice grille
Elle est correctement enregistrée !
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 !

3 réponses

Messages postés
14296
Date d'inscription
jeudi 24 décembre 2009
Statut
Membre
Dernière intervention
10 août 2017
1 091
up ! :)
Messages postés
14296
Date d'inscription
jeudi 24 décembre 2009
Statut
Membre
Dernière intervention
10 août 2017
1 091
Résolu : On devait écrire
char str_grillechar[longueur*hauteur +2];

Car il y a le caractère '\0' et le caractère '\n' !
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 736
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 :
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,