Problème écriture fichier [Résolu]

Signaler
Messages postés
27
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
21 mai 2008
-
Messages postés
27
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
21 mai 2008
-
Bonjour à tous !

J'ai besoin d'aide pour finaliser un projet pour la fac. Je dois réaliser un démineur, et j'ai un petit soucis pour finir. Je dois gérer les meilleurs scores et donc en cas de meilleur score écrire ce score dans un fichier.
Mon fichier texte est très simple, au début les scores sont initialisés à 999, avec une ligne par niveau :

999
999
999
999

J'ai écrit une fonction pour se placer sur la ligne qui correspond au niveau de jeu, et écrire le score à cette ligne :

int ecrire_score(int choix, double score)
{
    FILE *f;
    int i=1;
    char temp;

    f=fopen("Score","r+t");
    if(f==NULL)
    {
        perror("Erreur d'ouverture du fichier ");
    }

    while(i<=4)
    {
        if(i==choix)
        {
            fprintf(f,"%lf\n",score);
            return(0);
        }
        else
        {
            fgets(&temp,MAX_LIGNE,f);
            i++;
        }
    }
    return(0);   
}

Problème : j'ai une erreur de segmentation, et le soucis vient du fgets, mais je ne sais pas comment corriger !

Si quelqu'un peut m'aider je le remercie d'avance !

9 réponses

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
14
fgets prend un pointeur char comme premier paramètre. Cependant, tu passes un char.

char temp[MAX_LIGNE]; // SI MAX_LIGNE N'EST PAS TROP GROS
...
fgets(temp, MAX_LIGNE, f);

C++ (@++)<!--
Messages postés
27
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
21 mai 2008

Pourtant j'ai fait la même chose dans une autre fonction et ça marche :

double lire_score(int choix)
{
    FILE *f;
    int i=1;
    double meilleur_score;
    char temp;
   
    f=fopen("Score","rt");
    if(f==NULL)
    {
        perror("Erreur d'ouverture du fichier ");
    }
   
    while(i<=4)
    {
        if(i==choix)
        {
            fscanf(f,"%lf",&meilleur_score);
            fclose(f);
            return(meilleur_score);
        }
        else
        {
            fgets(&temp,MAX_LIGNE,f);
            i++;
        }
    }
}

Bizarre non ?
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
14
Ce n'est pas parce que le code compile qu'il est correct.
Cette section ne fonctionnera pas d'avantage. Si l'erreur n'est pas située là lors du plantage, c'est simplement qu'il n'a pas exécuté ce bout de code (il a planté avant).

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
14
Ou alors i == choix lors de l'exécution ou il y a eu une erreur lors de l'ouverture du fichier. Menfin bref, le programme ne s'est pas rendu jusque là.

C++ (@++)<!--
Messages postés
27
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
21 mai 2008

Ok merci, je ferai les modifications que tu m'as conseillé :)
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonjour,

C'est peut-être une bêtise mais est-ce que celà ne serait pas plutôt dû à l'alignement en mémoire sur des blocs de 4 octets ?

Le caractère temp occupe bien un octet mais les 3 qui suivent sont bloqués par l'alignement des données sur 4 octets, donc la lecture déborde dessus sans rien casser puisqu'il n'y a, justement, que 4 caractères à lire (3 caractères du nombre + fin de ligne) !

Jean-François
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
14
Je ne pense pas. J'ai fais les tests et, sous linux du moins, l'erreur de segmentation est bien détectée peut-importe qu'il y ait une variable qui suit ou non.

C++ (@++)<!--
Messages postés
27
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
21 mai 2008

Si ça peut être utilise voici un lien pour télécharger l'intégralité de mon démineur. Pour info je travaille sous linux.

http://rapidshare.com/files/116318259/demineur.rar.html
Messages postés
27
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
21 mai 2008

SAKingdom je te remercie le problème venait bien de là !