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 :

Supprimer le dernier saut de ligne dans un fichier texte


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 49
    Points
    49
    Par défaut Supprimer le dernier saut de ligne dans un fichier texte
    Bonjour,

    Je souhaiterai savoir comment on peut supprimer le dernier saut de ligne dans un fichier de texte, en language c, car je suis en-bêté avec se saut de ligne quand je charche ce fichier qui contient des matière il me compte une matière de plus en m'éffichant n'importe quoi, c'est acause de ce dernier saut de ligne,

    Merci d'avance pour votre aide


    Dav79

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Il ne faut pas supprimer le dernier saut de ligne d'un fichier texte car cela aurait pour effet de ne pas le rendre valide.

    Un fichier texte est formaté en général de la façon suivante :

    texte \n (et \r pour windows)
    texte \t

    ....
    texte \n ^d
    Ton fichier se termine donc par une fin de ligne et une fin de fichier.

    Bref, il faut que tu revois ton algo ... Envoie le code, on pourra peut être t'aider.

  3. #3
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par BOLARD
    Bonjour,

    Je souhaiterai savoir comment on peut supprimer le dernier saut de ligne dans un fichier de texte, en language c, car je suis en-bêté avec se saut de ligne quand je charche ce fichier qui contient des matière il me compte une matière de plus en m'éffichant n'importe quoi, c'est à cause de ce dernier saut de ligne,

    Merci d'avance pour votre aide


    Dav79
    Ha ! Es-tu sûr qu'il s'agit du dernier saut de ligne qui fait que tu récupères des données en trop (moi je ne pense pas ) ?
    => un feof() est peut être utilisé à mauvais escient
    => la boucle de lecture n'est pas correcte.

    Il faudrait que tu postes un minimum de code pour voir.

    A+

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 49
    Points
    49
    Par défaut Détaille du problème concernant le dernier saut de ligne du fichier texte
    Bonjours, je vous respose mom problème

    Voilà pour un peu code qui détaille mon problème.



    En faite il y a 4 fonction une
    - chargement_matiere : fonction qui va chargerr le tableau dans le tableau de struture matière à partir d'un fichier texte
    - affichMenuMat : fonction qui va afficher le tableau de structure de matière
    - enregistreNbQuizMat : cette fonction va enregistrer le nombre de quiz par matière dans le fichier texte var écrasé le fichier dfu chargemnts pour rmeplacer les valeurs
    - dernier fonction ouvertureFichier : qui ouvre le fichier à partir de son nom et du type d'ouverture.


    Le problème qui se pose c'est au deuxième chargements du tableau matière avec l'affichage de la strucuture, ou il m'affiche un matière de plus, c'est depuis quie j'ai voulus enregistrées le nombre de quiz par matière ou j'ai ce phénomène à l'affichage,



    Merci d'avance pour vote aidie





    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
    91
    92
    93
    94
    95
    96
     
     
     
     
    /***************************************************************************************************** 
    Chargements des matières dans une structure matière qui contient le nombre de quiz par matière 
    et le nom des matières, à partir d'un fichier texte
    Cette fonction qui contient :
            - tableau de structure matière
            _ retourne en valeur dfe sortie le nombre de matières disponibles actullement 
    ***************************************************************************************/
    void chargement_matiere(struct matiere tabMat[], int *cptMatieres)
    {
         FILE* fchMatiere;
         char chaine[30];
         int cptMat = 0;
         int i;
     
         fchMatiere = ouvertureFichier(FICH_TEXT_MATIERE,"rt"); // la dernière d'ouverture de fichier
         while (!feof(fchMatiere))
         {
               fgets(chaine,20,fchMatiere);        
               sscanf(chaine,"%d %s",&tabMat[cptMat]._nbMatQuiz, tabMat[cptMat]._nomMatiere);
              	cptMat++;
         }
         fclose(fchMatiere);
         cptMat--;
         *cptMatieres = cptMat ;
    }
     
     
    /***************************************************************************************
    Parcours et affichage de la structure matiere :
    Cette fonction à trois paramètres :
            - le tableau de structure matière 
            - le nombre de matière actuellement enregistré dans le fichier binaire 
            - une chaîne de caractére c'est une constante de châine sans importance
    ******************************************************************************************/
    void affichMenuQuizMat(struct quizMatiere tab[], int nbLign, char* message)
     	{
              int i;
              system("cls");
              puts(message);
             for (i = 0; i<= nbLign ;i++)
             {
    			printf("%d : %s",i+1,tab[i]._nomQuiz);
             } 
             puts(" ");    
       }
     
     
     
    /*********************************************************************************************************
    Fonction d'enregistrement de la structure matiere qui contient le nombre de quiz par matiere
    et le nom de la matière  
    Fonction contenant : 
            - le tableau de structure matière 
            - le numéro de matière sélectonné par l'utilisateur
            - le nombre de matière disponibles actuellement dans l'applicatoin 
    **********************************************************************************************/
    void enregitreNbMatQuiz(struct matiere x_tabMat[], int x_numMat, int x_nbMat)
    {
         FILE* fchMatiere;
         int i ;
     
     
         fchMatiere = ouvertureFichier(FICH_TEXT_MATIERE,"wt");
     
         for (i=0;i<= x_nbMat;i++)
         {
     
             fprintf(fchMatiere,"%d\ \t %s\n",x_tabMat[i]._nbMatQuiz, x_tabMat[i]._nomMatiere);
     
         }
     
    }
     
    /*********************************************************************************************************      
     Fonction ouverture fichier qui contient le nom du fichier à ouvrir avec le type de'ouverture
    **************************************************************************************************************/  
     FILE* ouvertureFichier(char * nomFichier, char * typeOuverture)
     {
               FILE* fichier;                   
               fichier = fopen(nomFichier,typeOuverture);
               if ( fichier == NULL)
               {
                  system("cls");
                  printf("Erreur à l'ouverture du fichier");
                  getch();
                  exit(-1);
               }
               else
               {
                   return fichier;
               }
    }

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Foobar1329
    => un feof() est peut être utilisé à mauvais escient
    Citation Envoyé par BOLARD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
         while (!feof(fchMatiere))
         {
               fgets(chaine,20,fchMatiere);


    http://emmanuel-delahaye.developpez....s.htm#fichiers

  6. #6
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Bingo !

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 49
    Points
    49
    Par défaut
    Merci Foobar1329,pour ta réaction face à ce problème, mais je trouve que tu restre très vague, comment tu veux que je gère ça. Il faut bien que je parcours ce fichier en entier, je te r'explique mon peroblème.

    Je doit créer une application quiz. Donc j'ai un fichier text qui va contenir
    les maières : nombre de quiz par matière et le nom des matières.
    Je charge ce fichier dans un tableau de structure ensuite j'affiche ce tableau de structure,
    jusqu'ici tout va bien, après je créé un nouveau quiz je passe le détaille... et quand j'enregistre ce quiz
    enfaite je vais incrémenter le tableau de structure qui contient le nombre de quiz par matière,
    ensuiste j'enregistre mon tableau de structure dans le fichier texte matière à la fin du programme.
    De nouveau quand je charge mes matières dans le tableau de structure à paritr de ce fichier,
    c'est la que j'ai un problème il m'affiche une ligne supplémentaire qui ne correspond à rien.
    Je pense que ce phénomène est dû au dernier \n dans le sprinf....
    qui enregistre le tableau de le structure dans le fichier et lorsque
    je charge mon fichier matière mon compteur de matière compte une matière supplémentaire,
    c'est comme si '\n' était considéré comme une chaîne de caractère. Avant je n'avait aucun peroblème avant que j'enregistre le tableau de structure dans le fichier texte.
    J'avais créer maninuellement le fichier texte et les chargements ce faisaient correctement.


    // Je pense que le problème il est dans la fonction enregitreNbMatQuiz
    for (i=0;i<= x_nbMat;i++)
    {

    fprintf(fchMatiere,"%d\ \t %s\n",x_tabMat[i]._nbMatQuiz, x_tabMat[i]._nomMatiere);

    }


    Je c'est pas si tu as une solution si tu peux la développez est ce que quelqu'un aura une idée pour me débloquer dans mon problème, merci d'avance

    Dav79

  8. #8
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par BOLARD
    Merci Foobar1329,pour ta réaction face à ce problème, mais je trouve que tu restre très vague, comment tu veux que je gère ça. Il faut bien que je parcours ce fichier en entier, je te r'explique mon peroblème.

    Mais je l'ai bien compris ton problème , as-tu seulement lu par exemple le lien qu'Emmanuel a fourni (notes excellentes par ailleurs) pour comprendre pourquoi ?

    * Dans chargement_matiere(),

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (!feof(fchMatiere))
    {
       fgets(chaine,20,fchMatiere);        
       sscanf(chaine,"%d %s",&tabMat[cptMat]._nbMatQuiz, tabMat[cptMat]._nomMatiere);
       cptMat++;
    }
    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while (fgets(chaine,20,fchMatiere))        
    {
        if ( sscanf(chaine,"%d %s",&tabMat[cptMat]._nbMatQuiz, tabMat[cptMat]._nomMatiere) != 2) {
             /* erreur : conversions non reussies par sscanf() */
             break; /* par exemple ... on peut skipper et passer à la ligne suivante avec continue; aussi si on veut */
        } 
        cptMat++;
    }
    Et plus besoin de l'affreux cpt-- après ton while, qui cache le véritable bug.

    Penser aussi à vérifier que cptMatieres n'est pas NULL...

    * Dans affichMenuQuizMat(),

    Penser à vérifier que message n'est pas NULL.

    Si le tableau tab a nbLign éléments, la condition d'arret de la boucle for n'est pas bonne.

    * Dans enregitreNbMatQuiz(),

    Si le tableau x_tabMat a x_nbMat éléments, la condition d'arret de la boucle for n'est pas bonne.

    Penser à fermer fchMatiere (fclose(), il n'y en a pas).

    * Dans ouvertureFichier(),

    Les seules valeurs portables que exit() peut avoir en argument sont 0, EXIT_SUCCESS et EXIT_FAILURE (stdlib.h).


    Citation Envoyé par BOLARD
    // Je pense que le problème il est dans la fonction enregitreNbMatQuiz
    for (i=0;i<= x_nbMat;i++)
    {

    fprintf(fchMatiere,"%d\ \t %s\n",x_tabMat[i]._nbMatQuiz, x_tabMat[i]._nomMatiere);

    }
    Ben si x_tabMat a x_nbMat éléments, ça ne va pas le faire.

    En C, pour un tableau de N éléments, le dernier élément est à l'indice N-1 et non N. La façon idiomatique d'écrire une boucle for en incrémentation, c'est par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int index;
    for(index=0; index< N; index++)  { ... }

    A+

Discussions similaires

  1. Supprimer les sauts de lignes dans un fichier
    Par Tornade8912 dans le forum VB.NET
    Réponses: 2
    Dernier message: 16/03/2015, 13h49
  2. Réponses: 6
    Dernier message: 15/02/2010, 10h13
  3. saut de ligne dans un fichier texte ?
    Par jessy212 dans le forum Access
    Réponses: 12
    Dernier message: 23/08/2006, 17h05
  4. [MFC] Saut de ligne dans un fichier texte
    Par le-makinero dans le forum MFC
    Réponses: 2
    Dernier message: 18/04/2006, 10h40
  5. Réponses: 9
    Dernier message: 23/05/2005, 09h35

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