IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

erreur d'affichage du programme


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 336
    Par défaut erreur d'affichage du programme
    bonjours quand j 'execute mon programme lorsqu'il écrit que se soit en console ou dans un fichier il me met une ligne en plus avec tout et n'importe quoi comme chiffre. pourriez vous me dire d'où vient cette erreur s'il vous plait ?

    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    main()
    {
        int i,nbpoint[27]={0},frequence[27]={0};
        char lettre[28]={0.};
     
        FILE *fdat;
        FILE *fres;
        fdat=fopen("scrabble.dat","r");
        fres=fopen("claub010.res","w");
     
        i=0;
        fgets(&lettre[i],2,fdat);//(fdat,"%1c",&lettre[i]);
        while(!feof(fdat))
        {
     
            fscanf(fdat,"%2d",&nbpoint[i]);
            fscanf(fdat,"%2d",&frequence[i]);
     
            printf("%1c     ",lettre[i]);
            printf("%2d     ",nbpoint[i]);
            printf("%2d     \n",frequence[i]);
     
            /*fprintf("%1c     ",lettre[i]);
            fprintf("%2d    ",nbpoint[i]);
            fprintf("%2d\n",frequence[i]);*/
     
            i++;
            fgets(&lettre[i],2,fdat);//fscanf(fdat,"%1c",&lettre[i]);
        }
    }
    voici le fichier de donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    A  5  9 B 10 13 C  7  3
    D 10  6 E  2 15 F  8 12
    G  4  7 H  7  4 I 10  4
    J  9  8 K  3  9 L  4  8
    M 10  9 N  8  2 O  4  8
    P  6 10 Q  3 11 R  3  5
    S 11  4 T  7  5 U  9  3
    V  2 10 W  3  9 X  2 10
    Y  1 11 Z  1 12 *  2  0

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Ton problème doit venir des sauts de lignes et des espaces présents entre les fréquences et les lettres suivantes contenus dans le fichier source et qui font qu'on dépasse les capacités des tableaux.

    Un solution simple pour contourner ton problème serait de vérifier que le dernière lettre lue est bien une lettre (A-Z ou *) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        fgets(&lettre[i],2,fdat);//(fdat,"%1c",&lettre[i]);
        while(!feof(fdat))
        {
            if((lettre[i] != '\n')&&(lettre[i] != ' '))
            {
                fscanf(fdat,"%2d",&nbpoint[i]);
                fscanf(fdat,"%2d",&frequence[i]);
     
                printf("%1c     ",lettre[i]);
                printf("%2d     ",nbpoint[i]);
                printf("%2d     \n",frequence[i]);
               i++;
            }
            fgets(&lettre[i],2,fdat);//fscanf(fdat,"%1c",&lettre[i]);
        }

    Après, lire les données directement en les stockant dans un tableau n'est pas une bonne idée.

    Une bonne pratique serait de passer par des variables temporaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void)
    {
        int i = 0, nbpoint[27] = { 0 }, frequence[27] = { 0};
        char lettre[27] = { 0 };
     
        int tmp_point, tmp_freq;
        char tmp_lettre;
     
        FILE *fdat;
     
        fdat = fopen("scrabble.dat", "r");
        /* toujours vérifier que le fichier a bien été ouvert. */
        if (NULL == fdat) {
            perror("scrabble.dat");
            return 1;
        }
     
        while (1) {
     
            /* on tente de lire une trio lettre, points, fréquence depuis le 
               fichier.
               Si tout est ok (fscanf renvoie 3) on stoque ce qui est lu dans les tableaux*/
            if (3 == fscanf(fdat, "%1c %2d %2d", &tmp_lettre, &tmp_point, &tmp_freq)) {
                lettre[i] = tmp_lettre;
                frequence[i] = tmp_freq;
                nbpoint[i] = tmp_point;
     
                printf("%1c %2d %2d\n", lettre[i], nbpoint[i], frequence[i]);
     
                /* on incrémente i seulement si tout s'est bien passé */
                ++i;
            } else {
                /* fscanf a échoué, il peut y avoir 3 raisons : 
                   fin de ligne (on reste dans la boucle while)
                   fin de ficher (feof renvoie 1) : on sort de la boucle while
                   erreur plus grave de lecture (ferror renovie 1) : on sort aussi */
                if (feof(fdat) || ferror(fdat)) {
                    /* sortie de la boucle while */
                    break;
                }
            }
        }
     
        fclose(fdat);
     
        return 0;
    }

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Citation Envoyé par mabu Voir le message
    • feof ne fait pas ce que tu penses. Il ne faut pas l'utiliser comme tu le fait.
    C'est ce que je m'apprétais à dire également mais, en relisant son code, je m'aperçois qu'il est quand même valide sur ce point : il y a un premier fgets() effectué hors de la boucle, puis la condition while elle-même qui teste feof(), le contenu de la boucle et le fgets() suivant tout en bas. Ce qui fait que chaque fgets() est immédiatement suivi d'un contrôle de feof(), et bien a posteriori.

    Ça reste maladroit bien sûr; car d'autres erreurs à la lecture peuvent se produire, mais pour un programme de débutant, on peut supposer que les conditions du succès soient déjà toutes réunies au lancement du programme…

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    L'usage simultané de fgts() et fscanf() va poser des problèmes :

    - fgets() lit le A,
    - puis fscanf(...,"%d",...) lit le 5 et le fichier est positionné derrière le 5.
    - puis fscanf(...,"%d",...) lit le 9 et le fichier est positionné derrière le 9.
    Ensuite, ça se gâte :
    - Le fgets() suivant va lire le caractère derrière le 9, à savoir le blanc et non pas le B et positionne le fichier devant le B
    - Du coup les fscanf() suivant échouent (B n'est pas un nombre décimal) et on obtient n'importe quoi.
    - Puis le fgets() va lire le B
    - etc.
    Je te propose soit de n'utiliser que fgets() et d'analyser la portion de ligne lue, soit de n'utiliser que fscanf(). Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        i=0;
        while(3 == fscanf(fdat,"%*[^A-Z*]%c%d%d",&lettre[i],&nbpoint[i],&frequence[i]))
        {
            printf("%1c     ",lettre[i]);
            printf("%2d     ",nbpoint[i]);
            printf("%2d     \n",frequence[i]);
            i++;
        }
    Une petite explication :
    - La valeur de retour de fscanf() permet de savoir si on a bien lu 3 éléments. Si ce n'est pas le cas , il y a fin ou erreur du fichier
    - Le format utilisé "%*[^A-Z*]" lit tous les caractères tant que les caractères ne sont pas (à cause du ^) entre 'A' et 'Z' ou le caractère '*' et les ignore (à cause du *).
    - "%c%d%d" lit alors la lettre et les deux entiers.

  5. #5
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 336
    Par défaut
    salut mabu ta solution fonctionne belle et bien mais je ne comprend pas la condition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       ...
            if((lettre[i] != '\n')&&(lettre[i] != ' '))
            {
                ...
            }
           ...
    pourquoi faudrait-il lire les points et la fréquence si la lettre contenue dans le tableau est différent du retour à ligne et différent d'un espace ?
    en fait, je m'explique, dans le vecteur lettre[] il y aura toujours une lettre dedans mais avec un espace avant et/ou après. Ou alors c est que je me trompe quelque part dans mon raisonnement ?

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par dharkan Voir le message
    salut mabu ta solution fonctionne belle et bien mais je ne comprend pas la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((lettre[i] != '\n')&&(lettre[i] != ' '))
    Il faut décomposer le problème :

    Tel que tu l'as écrit, le fgets permet de lire 1 caractère depuis le fichier.

    Mais il faut voir le fichier comme ça (je remplace les espaces par des .):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A..5..9.B.10.13.C..7..3\nD.10..6
    'A' qui est lu, puis les deux scanf lisent points et fréquence.
    A ce point, a été lu : Suit dans le buffer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .B.10.13.C..7..3\nD.10..6

    Un autre fgets, qui lit un espace. Il faut donc attendre d'avoir lu correctement un lettre avant de tenter de lire points et fréquence.

    La solution proposée par diogène est la plus propre : avec une expression rationnelle, on cherche à ne lire que les lettres de A à Z et le caractère *

    PS : au passage, plutôt qu'utiliser fgets pour lire un caractère, on peut utiliser fgetc.

Discussions similaires

  1. [MySQL] erreur lors de l'affichage du programme d'inscription des enseignants
    Par fleurrouge dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 22/11/2012, 10h41
  2. Erreur d'affichage d'un entier
    Par LEK dans le forum C++
    Réponses: 1
    Dernier message: 14/10/2005, 15h34
  3. TExcelApplication : erreur en quittant le programme
    Par Bleuarff dans le forum Composants VCL
    Réponses: 6
    Dernier message: 09/09/2005, 14h21
  4. Delphi 2005 : Erreur de compilation du programme
    Par bigbestboy dans le forum Langage
    Réponses: 6
    Dernier message: 03/08/2005, 18h14
  5. erreur d'affichage
    Par bachilbouzouk dans le forum ASP
    Réponses: 6
    Dernier message: 20/04/2005, 16h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo