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 :

Découper ligne d'un texte en C


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 15
    Points
    15
    Par défaut Découper ligne d'un texte en C
    Bonjour à tous,

    Voila mon problème, j'ai in fichier texte en entrée qui contient une rafale de "0" et de "1", le but de mon programme est de trier ce fichier pour avoir une meilleure lisibilité de mon fichier.
    J'ai besoin de séparer le contenu en plusieurs lignes de 24 bits (déjà fait et fonctionnel ) puis je doit extraire de ces 24 bits trois champs de tailles différentes pour ensuite les affichés à savoir champ1 4 bits, champ2 8 bits et champ3 12 bits.
    J'ai beau essayer je n'arrive pas à découper les lignes .
    Ci joint mon code pour la séparation en plusieurs lignes.
    Merci d'avance pour votre aide tout le monde .

    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
    #include <stdio.h>
    #include <stdlib.h>
    #define ENTREE "test_trie.txt"
    #define SORTIE "resultat_trie.txt"
     
    int main(void)
    {
      FILE *f_in, *f_out;
      int tab;
      int compteur1 = 0;
      int compteur2 = 0;
      int compteur3 = 0;
      int taille = 0;
      int addr = 4;
      int cpt = 8;
      int val_reg = 12;
     
    /************ OUVERTURE FICHIER *********************************/
     
      if ((f_in = fopen(ENTREE,"r")) == NULL)
        {
          fprintf(stderr, "\nErreur: Impossible de lire le fichier %s\n",ENTREE);
          return(EXIT_FAILURE);
        }
      if ((f_out = fopen(SORTIE,"w")) == NULL)
        {
          fprintf(stderr, "\nErreur: Impossible d'ecrire dans le fichier %s\n", \
    SORTIE);
          return(EXIT_FAILURE);
        }
     
    /************* PARCOURS DU FICHIER *****************************/
     
       		while(fgetc(f_in) != EOF)
        		compteur1 ++; /* incrémentation du compteur */
     
     
    /************* CALCULER LE NOMBRE DE CARACTERES ****************/
     
    printf("Le nombre de caracteres du fichier est de : %d\r\n", compteur1);
     
    /************* CHOIX DE LA TAILLE DE DECOUPAGE *****************/
     
    printf("Entrer la taille du registre : ");
    scanf("%d", &taille); 
     
    /************* RECOPIE CARACTERE PAR CARACTERE ET TRIE *********/
     
    if((f_in = fopen(ENTREE, "r")) != NULL) 
    {
       while (!feof(f_in))
       {
          if (compteur2 !=taille)
    	{
          fread(&tab, 1, 1, f_in);
          fputc(tab, f_out);
          compteur2++;
    	}
          else
            {
             fputs ("\r\n",f_out);
    	 compteur2=0;
            }
       }
    }
     
      fclose(f_in);
      fclose(f_out);
      return(EXIT_SUCCESS);
    }

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Ton problème revient-il à découper une chaîne de 24 (taille dite "du registre" donnée au clavier ?) caractères (0 et 1) en 3 chaînes des tailles indiquées ?

    Pourrais-tu nous donner un exemple de fichier d'entrée stp ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Ton problème revient-il à découper une chaîne de 24 (taille dite "du registre" donnée au clavier ?) caractères (0 et 1) en 3 chaînes des tailles indiquées ?

    Pourrais-tu nous donner un exemple de fichier d'entrée stp ?
    alors j'ai un fichier texte qui contient par exemple 000100010110110000111010000100010110110000111010000100010110110000111010000100010110110000111010
    mon programme les met sous forme de

    000100010110110000111010
    000100010110110000111010
    000100010110110000111010
    000100010110110000111010

    ce que je voudrais faire maintenant c'est afficher sous forme de adresse|cpt|valeur sachant que adresse est sur 4 bits cpt sur 8 bits et valeur sur 12 bits pour ensuite les ecrires par exemple pour adresse 0001 c'est tari
    afficher tari à "cpt" contient "valeur".

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonjour,

    tu as juste a faire ceci
    adresse = char [4]
    cpt = char [8]
    valeur = char [12]

    Je veux pas être rabat-joie mais ce ne sont pas des bit

    car un caractère(char) = 1 octet = 8 bits.

    Bonne journée

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void)
    {
        //const char original[] = "000100010110110000111010";
        const char original[] = "ABCD12345678123456789012";
        printf("%s = %d bits\n", original, strlen(original));
     
        char adresse[5] = {0};
        char cpt[9] = {0};
        char valeur[13] = {0};
     
        size_t i=0;
        for(; i < 4; adresse[i] = original[i], i++);
        for(; i < 12; cpt[i-4] = original[i], i++);
        for(; i < 24; valeur[i-12] = original[i], i++);
     
        printf("Adresse = '%s' (%d)\n", adresse, strlen(adresse));
        printf("Cpt = '%s' (%d)\n", cpt, strlen(cpt));
        printf("Valeur = '%s' (%d)\n", valeur, strlen(valeur));
     
        return 0;
    }
    Une chaine et des sous-chaines, des copies des indices qui vont bien jusqu'à d'autres indices qui vont bien.

    @jouana : et un emplacement supplémentaire pour l'\0

    Ce ne sont effectivement pas des bits mais bien des chaines représentant des suites de bits/

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Exact il faut penser au '\0' c'est beaucoup plus propre après je ne donnai pas la réponse mais juste une orientation mais tu as raison ça peut entraider beaucoup d'autres soucis par le suite.

    Mea culpa.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    Merci à tous pour vos réponses, j'essaye ça et je vous tiens au courant si c'est bon

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    Bon voila le topo j'ai essayer avec la méthode proposée mais malheureusement l'affichage ne marche que pour la première ligne.
    Pour toutes les suivantes il continu de m'afficher la première de la manière suivante :
    Ligne : 000100010110110000111010
    Adresse = '0001' Cpt = '00010110' Valeur = '110000111010'

    Ligne : 001000010110110000111010
    Adresse = '0001' Cpt = '00010110' Valeur = '110000111010'

    j'ai essayé de le mettre dans une boucle qui dépend du nombre de ligne mais ça ne marche toujours pas.

    Donc svp si quelqu'un à d'autres idées je lui en serais infiniment reconnaissant.

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    A tout hasard, tes lignes sont bien différentes dans ton fichier? (ce n'est pas le cas dans ton exemple, quelques posts plus haut
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    bonjour,

    effectivement mes lignes sont différentes ce que j'ai écrit plus haut été juste à titre d'exemple.

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Mouais, enfin mettre à titre d'exemples deux entrées identiques qui donnent deux sorties identiques et dire "ça marche pas ça sort toujours la même chose", c'est complètement nul.

    Peut-on avoir le code complet et un fichier exemple pour reproduire le problème ?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    En ce qui concerne le code le voila
    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
    #include <stdio.h>
    #include <stdlib.h>
    #define ENTREE "resultat_trie.txt"
    #define SORTIE "resultat_affichage.txt"
     
    int main(void)
    {
      FILE *f_in, *f_out;
      int i=0, taille = 0;
      int tab;
      char addr [5];
      char cpt [9];
      char val_reg [13];
     
    /************ OUVERTURE FICHIER *********************************/
     
      if ((f_in = fopen(ENTREE,"r")) == NULL)
        {
          fprintf(stderr, "\nErreur: Impossible de lire le fichier %s\n",ENTREE);
          return(EXIT_FAILURE);
        }
      if ((f_out = fopen(SORTIE,"w")) == NULL)
        {
          fprintf(stderr, "\nErreur: Impossible d'ecrire dans le fichier %s\n", \
    SORTIE);
          return(EXIT_FAILURE);
        }
     
    /************* PARCOURS DU FICHIER LIGNE PAR LIGNE*****************************/
     
       		if ( f_in != NULL )
       {
          char line [ 128 ]; /* or other suitable maximum line size */
     
          while ( fgets ( line, sizeof line, f_in ) != NULL ) /* read a line */
          {
             printf("Ligne : %s", line); /* write the line */
     
        	 for(; i < 4; addr[i] = line[i], i++);
       	 for(; i < 12; cpt[i-4] = line[i], i++);
       	 for(; i < 24; val_reg[i-12] = line[i], i++);
    	 printf("Adresse = '%s'  ", addr);
      	 printf("Cpt = '%s'  ", cpt);
       	 printf("Valeur = '%s'\r\n", val_reg);
    	 printf("\r\n");
     
          }
          fclose ( f_in );
          fclose ( f_out);
       }
       else
       {
          perror ( ENTREE ); /* why didn't the file open? */
       }
       return 0;
    }


    et pour le test il suffit de créer un fichier texte avec plusieurs 0 et 1

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    par exemple

    000100010110110000111010

    001000010110110000111010

    001100010110110000111010

    011100010110110000111010

    011100010110110000111010

    011100010110110000111010

    011100010110110000111010

    011100010110110000111010

    000100010110110000111010

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Il faut aussi initialiser les tableaux avec des zéros comme je l'ai fait dans mon code, sinon les '\0' de fin de chaines ne sont pas présents. L'affichage montre alors des chaines plus grandes que prévues et des parenthèses chez moi.

    Et surtout, il faudrait peut-être remettre i à 0 de temps en temps, histoire d'écrire au début des tableaux ! Sinon à la seconde ligne, i vaut 24 et aucun des boucles for() ne fait d'itération, laissant tes tableaux inchangés.

    Tu insistes avec les exemples inutiles en nous donnant encore une fois des entrées quasi-identiques. Même entrée, même sortie, c'est le principe d'un tel programme !
    Les lignes identiques sont regroupées et les parties changeantes ne sont que sur les 4 premiers caractères....

    0010 00010110110000111010

    0011 00010110110000111010

    0111 00010110110000111010
    0111 00010110110000111010
    0111 00010110110000111010
    0111 00010110110000111010
    0111 00010110110000111010

    0001 00010110110000111010
    0001 00010110110000111010
    Si tu veux voir l'effet du code, mets des entrées vraiment différentes. Comme en plus tu travailles avec des caractères, tu peux mettre des lettres, des chiffres, des caractères spéciaux pour rendre tout ça plus visuel.

    Tu as deux variables non utilisées dans ton code, supprimes-les

    Note aussi que tu n'es pas obligé d'écrire "\r\n" dans tes printf(), tu peux te contenter d'"\n". En effet, le compilateur sait sur quel OS il travaille et convertira automatiquement dans le bon format.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup ca marque parfaitement

  16. #16
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bien

    Clique sur le bouton en bas de la page si tout est réglé.

  17. #17
    Membre actif Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Points : 222
    Points
    222
    Par défaut
    Est que quelque chose comme ça aurait pu faire l'affaire?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
     
    int main(void)
    {
        char s[] = "001100010110110000111010";
     
        printf("Adresse = %.*s\n", 4, s);
        printf("Cpt = %.*s\n", 8, &s[4]);
        printf("Valeur = %.*s\n", 12, &s[12]);
        return 0 ;
    }
    Bien sûr en incluant le code pour lire le fichier.


  18. #18
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je ne connaissais pas cette écriture et pour un simple affichage, elle est parfaite !

    J'étais parti dans l'optique "extraction", d'où la création de nouveaux tableaux. Si on travaille en C99, on doit d'ailleurs pouvoir remplacer les boucles for() par des sprintf() avec des formats similaires

    +1

  19. #19
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    On peut aussi utiliser directement %.4s plutot que %.*s si on ne veut pas spécifier la taille dans les arguments.
    De même, on pourrait choisir s+4 à la place de &s[4].

    c'était mon petit grain de sel
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sur la même ligne mettre du texte à gauche et à droite
    Par Oberown dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 20/06/2007, 15h50
  2. [swing] jLabel et retour à la ligne dans le texte ?
    Par daed dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 04/05/2006, 11h35
  3. aller à la ligne dnas un texte
    Par pierre.egaud dans le forum Access
    Réponses: 3
    Dernier message: 02/05/2006, 13h56
  4. FireFox - Retour à la Ligne - Zone de Texte [CSS]
    Par Neroptik dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 25/02/2006, 18h34
  5. pb lecture de ligne dans un texte
    Par bidoo dans le forum C++
    Réponses: 4
    Dernier message: 22/10/2005, 13h23

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