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 :

nombres caracteres dans une ligne d'un fichier


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 22
    Points : 8
    Points
    8
    Par défaut nombres caracteres dans une ligne d'un fichier
    Bonjour
    J'ai voulu calculer le nombre de caracteres dans une ligne dans un fichier texte mais j'ai une boucle infini j'ai debuger mais j'ai compris ou est le problemes
    Voici mon code source

    MotCache.c
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    #define TAILLE_MAX_MOT 300
        #include <stdlib.h>
        #include <stdio.h>
        #include "util.h"
     
        int nbLigne(FILE* fichierGrille);
        int nbColonne(FILE* fichierGrille);
        int testFichierVide(FILE* fichier);
        int tailleFichier(FILE* fichier);
     
        int main(int argc ,char* argv[]){
     
        FILE* fichierGrille = fopen("grilleTest1.txt","r");
         FILE* fichierMotATrouver = fopen("motAChercher.txt","r");
         int i=0;
     
     
          if(fichierGrille==NULL && fichierMotATrouver==NULL){
     
         print_erreur(FICHIER_OUVERTURE_ERREUR);
         }
         else if(tailleFichier(fichierGrille)==0){
     
            print_erreur(FICHIER_GRILLE_ERREUR);
     
         } else if (tailleFichier(fichierMotATrouver)==0 ){
     
           print_erreur(FICHIER_LISTE_MOTS_VIDE_ERREUR);
     
         }else{
     
     
           int comptColonne=0;
          while(fgetc(fichierGrille)!='\n'){
             comptColonne++;
     
           }
     
         /*if(fichierMotATrouver==NULL){
         print_erreur(FICHIER_OUVERTURE_ERREUR);
         }else{
     
         }*/
     
        int res= nbLigne(fichierGrille);
        int res2 =nbColonne(fichierGrille);
     
        printf("Le nombre de ligne est %d\n",res);
     
            printf("Le nombre de colonne est %d\n",res2);
        }
     
     
     
        fclose(fichierGrille);
        fclose(fichierMotATrouver);
        }
     
     
     
        int nbLigne(FILE* fichierGrille){
        int compteurLigne=0;
        char mot[TAILLE_MAX_MOT];
           while(!feof(fichierGrille)){
     
                fgets(mot,TAILLE_MAX_MOT,fichierGrille);
                compteurLigne++;
                }
           return compteurLigne;
        }
     
        int nbColonne(FILE* fichierGrille){
     
         int car;
           int comptColonne=0;
           while(car =fgetc(fichierGrille)!='\n'){
             printf("%c",car);
             comptColonne++;
           }
     
         return comptColonne ;
     
           }
     
        int tailleFichier(FILE* fichier){
        fseek(fichier,0,SEEK_END);
        long lfile=ftell(fichier);
        return lfile;
        }
    util.c
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    #include "util.h"
     
    static char * tostring(int dir)
    {
        switch(dir)
        {
        case S :
            return "S";
        case N :
            return "N";
        case E :
            return "E";
        case O :
            return "O";
        case NE :
            return "NE";
        case NO :
            return "NO";
        case SE :
            return "SE";
        case SO :
            return "SO";
        default :
            return "erreur de direction";
        }
    }
     
     
    /**
    * À utiliser pour afficher la taille et le nom d'un élément
    */
    void print_position_mot(char * mot,int ligne, int colone, int direction)
    {
        printf("%s %d %d %s\n",mot,ligne,colone,tostring(direction));
    }
     
     
    void print_erreur(int err)
    {
        switch (err)
        {
     
        case FICHIER_GRILLE_ERREUR :
            printf("Erreur : fichier de la grille corrompu ou vide\n");
            break;
        case FICHIER_LISTE_MOTS_VIDE_ERREUR :
            printf("Erreur : Fichier vide\n");
            break;
        case FICHIER_OUVERTURE_ERREUR :
            printf("Erreur : ouveture du fichier\n");
            break;
        case NBRE_ARGUMENTS_ERREUR :
            printf("Erreur : nombre d'arguments incorect\n");
            break;
        case MOT_NON_TROUVE_ERREUR :
            printf("--ERREUR--\n");
            break;
     
        default:
            break;
        }
    }
    util.h
    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
     
    #ifndef UTIL_H
    #define UTIL_H
    #include <stdio.h>
    #include <stdlib.h>
     
     
    #define S 0
    #define N 1
    #define E 2
    #define O 3
    #define NE 4
    #define NO 5
    #define SE 6
    #define SO 7
     
    //Fichier de la gille corrompu ou vide
    #define FICHIER_GRILLE_ERREUR 1
     
    //Fichier liste de mots vide
    #define FICHIER_LISTE_MOTS_VIDE_ERREUR 2
     
    //Erreur d'ouverture d'un fichier
    #define FICHIER_OUVERTURE_ERREUR 3
     
    //Nombre d'arguments reçu inadéquat
    #define NBRE_ARGUMENTS_ERREUR 4
     
    // Mot non trouvé dans la grille
    #define MOT_NON_TROUVE_ERREUR 5
     
     
     
     
     
     
     
    /**
    * À utiliser pour afficher les erreurs
    */
    void print_erreur(int err);
     
    /**
    * À utiliser pour afficher la position d'un mot dans la grille
    */
    void print_position_mot(char * mot,int ligne, int colone, int direction);
     
    #endif
    grilleTest1.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    BONJOURETSET
    XLZABCRXRTSR
    CAXFGKLUMNPQ
    CVYKPDOPSRVN
    EARJZJQMDNCB
    FLMPWUQAMTPY
    motAChercher.txt
    La boucle infini est dans la fonction nbColonne
    Merci d'avance.

  2. #2
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 853
    Points : 2 166
    Points
    2 166
    Par défaut
    La fonction fgetc retourne EOF quand elle n'a plus rien a lire, ce que tu ne verifies pas. Va faire un tour ici pour plus d'infos.

    Cependant, pour plus de simplicite, je te conseille d'utiliser la fonction getline.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int nbColonne(FILE* fichierGrille) {
    	int car;
    	int comptColonne=0;
    	while(car =fgetc(fichierGrille)!='\n') {
    		printf("%c",car);
    		comptColonne++;
    	}
    	return comptColonne ;
    }
    Tu ne gères qu'une seule des deux conditions d'arrêt possibles: Tu dois supporter l'arrêt sur \n, mais aussi l'arrêt sur EOF.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    	while((car=fgetc(fichierGrille)) != '\n' && car != EOF) {

    Edit: Oups, grillé.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 042
    Points
    31 042
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par small44 Voir le message
    MotCache.c
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(fichierGrille==NULL && fichierMotATrouver==NULL){
     
         print_erreur(FICHIER_OUVERTURE_ERREUR);
    }
    Bonjour
    Que se passe-t-il si un seul des deux fichiers n'a pas été ouvert ???

    Citation Envoyé par small44 Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(!feof(fichierGrille)){
     
                fgets(mot,TAILLE_MAX_MOT,fichierGrille);
                compteurLigne++;
                }
    Non. feof() ne sert pas à détecter la fin de fichier. Cette détection se fait par la fonction de lecture elle-même (ici fgets())
    En faisant ainsi, tu as un fgets() qui ne fonctionne pas parce qu'il tente de lire après la fin mais comme tu ne testes pas cet échec, tu as compteurLigne qui s'incrémente une fois de trop...

    feof() sert à indiquer, une fois que le fichier a été lu et traité et que tu as déjà détecté un arrêt de lecture, si cet arrêt est dû à une fin de fichier ou à autre chose (comme une erreur).

Discussions similaires

  1. Nombre d'occurences dans une ligne d'un fichier
    Par delilou dans le forum Général Java
    Réponses: 2
    Dernier message: 24/03/2011, 17h26
  2. supprimer une chaine de caractere dans une ligne.
    Par wadabush dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 11/02/2009, 20h59
  3. Insérer la date dans une ligne d'un fichier
    Par odrimont dans le forum Linux
    Réponses: 1
    Dernier message: 09/07/2006, 13h32
  4. recuperer 3 float dans une ligne d'un fichier texte
    Par obiwankennedy dans le forum C++
    Réponses: 3
    Dernier message: 14/03/2006, 03h59
  5. Remplacement de caracteres dans une ligne
    Par tibyann dans le forum Linux
    Réponses: 10
    Dernier message: 14/02/2006, 12h12

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