Problème écriture fichier

Résolu
pitidragon Messages postés 27 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 21 mai 2008 - 20 mai 2008 à 18:04
pitidragon Messages postés 27 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 21 mai 2008 - 21 mai 2008 à 15:38
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

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
20 mai 2008 à 18:33
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++ (@++)<!--
3
pitidragon Messages postés 27 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 21 mai 2008
20 mai 2008 à 18:38
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 ?
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
20 mai 2008 à 18:49
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++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
20 mai 2008 à 18:53
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++ (@++)<!--
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pitidragon Messages postés 27 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 21 mai 2008
20 mai 2008 à 18:55
Ok merci, je ferai les modifications que tu m'as conseillé :)
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
20 mai 2008 à 19:02
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
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
20 mai 2008 à 19:06
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++ (@++)<!--
0
pitidragon Messages postés 27 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 21 mai 2008
20 mai 2008 à 19:15
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
0
pitidragon Messages postés 27 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 21 mai 2008
21 mai 2008 à 15:38
SAKingdom je te remercie le problème venait bien de là !
0
Rejoignez-nous