Erreur procédure chargement fichier

Résolu/Fermé
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 - Modifié par Franck7511 le 24/12/2013 à 14:15
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 26 déc. 2013 à 13:53
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 !
A voir également:

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 1 121
26 déc. 2013 à 12:34
up ! :)
0
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 1 121
26 déc. 2013 à 13:17
Résolu : On devait écrire
char str_grillechar[longueur*hauteur +2];

Car il y a le caractère '\0' et le caractère '\n' !
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
Modifié par fiddy le 26/12/2013 à 13:53
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,
0