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 :

diviser une chaine de caractere


Sujet :

C

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut diviser une chaine de caractere
    Bonjour,

    J'ai un fichier contenant deux champs: objet (chaine de caractère) et valeur(chaine de caractère)
    ces deux champs sont séparés par deux points :

    par exemple soit le fichier 'test.txt':

    1 3 4 10 : d b c
    5 2 16 8 : a d c


    Je voulais transformer ce fichier par exemple dans un autre fichier de sorte d'obtenir:

    1 : d b c
    3 : d b c
    4 : d b c
    10 : d b c
    5 : a d c
    2 : a d c
    16 : a d c
    8 : a d c

    Je n'arrive à transformer la chaine '1 3 4 10' transformés en quatre entiers 1, 3, 4 et 10
    et pour chaque entier on ajoute la même chaine valeur 'd b c'

    de même pour la chaine '5 2 16 8' transformés en quatre entiers
    5, 2, 16,8
    et pour chaque entier on ajoute la même chaine valeur 'a d c'

    S'il vous plait aidez moi.

    Merci.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Un peit exemple de ce que tu as fais ?

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Par défaut
    essaye de lire ton fichier ligne par ligne (getline() si tu es sur linux)

    pour chaque ligne localise la position des deux point ":" strstr()

    une fois la postion des ":" est connue il suffit de scinder la chaine en deux (strncpy() memcpy() )

    et pour decomposer la chaine (sous chaine) qui contient des entier tu peux utiliser strtok ()

    et en fin sprintf te prmet de construire la nouvelle chaine sous format souhaité.

    n'hésite pas à faire man sur les differentes fonction ( sur la console ou sur google)

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonsoir,

    Mon programme C est sous windows.

    Je n'arrive pas à coder les étapes décrites au dessus.

    Pouvez vous m'aider ?

    Merci.

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Je pense qu'il existe plusieurs solutions à ton problème mais celle qui me viens en tête en premier :

    • Tu dois commencer par stocker la valeur en recherchant d'abord la position tu caractère ':' ce que tu peux faire avec la fonction strchr puis tu stockes la chaîne restante à partir du pointeur retourné par cette fonction.
    • Tu fais pointer un pointeur sur ta chaîne (tu peux éventuellement faire une copie de la chaîne car elle sera modifiée avec ma solution. Ce pointeur va te permettre de voyager comme bon te semble dans la chaîne.
    • A partir de ton nouveau pointeur bin il te reste qu'à lire le caractère sur lequel il se trouve et l'écrire dans le nouveau fichier en prenant soin bien sûr de vérifier si le caractère n'est pas un espace, ce que tu peux faire avec la fonction isspace.


    Cette solution est surement un peu moins compliquée que celle de sofiane80. Tu dois cependant quand même lire le fichier ligne par ligne ce que tu peux faire avec la fonction fgets. Toutes ces fonctions sont plus faciles à utiliser que les autres qui t'ont étés proposées plus haut et restent également standard.


    J'espère t'avoir mis sur la voie, à toi de coder et de nous montrer ce que tu as fait
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonjour,

    Pouvez vous me donner d'exécution manuelle de votre idée car je n'ai pas compris comme il faut ?

    Je vous explique mon problème:

    En réalité, j'ai un fichier contenant deux champs: objet (chaine de caractère) et valeur(chaine de caractère)
    ces deux champs sont séparés par deux points :

    par exemple soit le fichier 'input.txt':

    1 3 4 10 : d b c
    5 2 16 8 : a d c

    Je voulais transformer ce fichier par exemple dans un autre fichier 'output.txt' de sorte d'obtenir:

    1 : d b c
    3 : d b c
    4 : d b c
    10 : d b c
    5 : a d c
    2 : a d c
    16 : a d c
    8 : a d c
    Je n'arrive à transformer la chaine '1 3 4 10' transformés en quatre entiers 1, 3, 4 et 10
    et pour chaque entier on ajoute la même chaine valeur 'd b c'

    de même pour la chaine '5 2 16 8' transformés en quatre entiers
    5, 2, 16,8
    et pour chaque entier on ajoute la même chaine valeur 'a d c'

    Je pensais à faire cette transformation car je voulais lire à partir de la chaine '1 3 4 10' l'entier 1 pour faire un autre traitement qui utilise ce entier et ne pas toute la chaine .
    de même on lit l'entier 3 puis l'entier 4 puis l'entier 10.

    après on fait la même chose pour la chaine '5 2 16 8' c'est à dire nous avons besoin de l'entier 5 puis 2 puis 16 puis 8.


    Que proposez vous ?

    Merci.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 109
    Par défaut
    Si on s'en considère strictement ce que tu demandes
    on peut le faire simplement avec fscanf() et fprintf()

    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
     
    #include <stdio.h>
     
    int main(void)
    {
      char  t_str[8];
      int   t_int[4],  i;
      FILE *f_in = 0, *f_out = 0;
     
      if(!(f_in = fopen("input.txt", "r")))
        return 1;
     
      if(!(f_out = fopen("output.txt", "w")))
      {
        fclose(f_in);
        return 2;
      }
     
      while(fscanf(f_in, "%d %d %d %d : %[^\n]", &t_int[0], &t_int[1], &t_int[2], &t_int[3], t_str) == 5)
      {
        for(i = 0; i < 4; i++)
        {
          printf("%2d : %s\n", t_int[i], t_str);
          fprintf(f_out, "%d : %s\n", t_int[i], t_str);
        }
      }
     
      fclose(f_out);
      fclose(f_in);
      return 0;
    }

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    une petite remarque de "bonne pratique" :

    il vaut mieux ne pas écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if(!(f_in = fopen("input.txt", "r")))
        return 1;
    mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if( (f_in = fopen("input.txt", "r")) == NULL )
        return 1;
    fopen est une fonction qui retourne un FILE*.

    La bonne pratique est de ne jamais faire d'hypothèses sur comment est pris une valeur, et de tester par rapport au type spécifié du retour de la fonction..

  9. #9
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonsoir,

    int t_int[4]

    Mais, les deux champs de fichier 'input.txt' ont un type une chaine de caractère.

    for(i = 0; i < 4; i++)

    Mais,je ne sais pas en avance le nombre d'entier à avoir.

    Par exemple un fichier 'input.txt':

    2 5 10 99 53 : a d c b
    1 8 12 80 : a c d
    8 2 15 : b c d

    Que proposez vous ?

    Merci.

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Bon déjà je n'aurais pas écrit de code, éventuellement de l'algorithmique mais sans plus, c'est pas de cette façon qu'on apprend le mieux en proposant un code mais bon passons...

    J'estime que si les entiers sont voués à êtres simplement écrits dans le nouveau fichier, il n'est nullement besoin de les convertir en entier mais les laisser en simple caractère est largement suffisant.

    J'estime également que pour un débutant, utiliser *scanf n'est franchement pas la meilleure idée moi j'ai proposé une solution sans conversion aucune, simplement des chaînes et des caractères et avec des fonctions simples et pas dangereuses à utiliser
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par siempre Voir le message
    Mais,je ne sais pas en avance le nombre d'entier à avoir.

    Par exemple un fichier 'input.txt':

    2 5 10 99 53 : a d c b
    1 8 12 80 : a c d
    8 2 15 : b c d

    Que proposez vous ?

    Merci.
    Ma solution, le tout géré grâce à une ou deux boucle while et tu peux avoir autant d'entiers que tu veux et autant de lignes que tu veux

    Je t'ai donné plus haut l'ordre exacte sur comment procéder, il te suffit de suivre à la lettre tout en lisant ligne par ligne grâce à une boucle et chaque ligne à l'intérieur de cette boucle peut être décortiquée par une autre boucle, le tout jusqu'à ce que tu n'est plus de ligne à lire et que chaque ligne est lue jusqu'au séparateur ':' !

    Je te ferais bien un algo textuel mais là je n'ai pas trop le temps, peut-être plus tard dans la journée mais essaye quand même en relisant mes post encore et encore, tout en essayant de coder ce que j'y ai décrit.

    Dire ne pas savoir le faire sans essayer de le faire n'est pas une solution, il faut juste se jeter à l'eau
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/11/2007, 13h36
  2. Réponses: 5
    Dernier message: 21/07/2004, 20h34
  3. Extraire un nom d'une chaine de caractere
    Par iamspacy dans le forum Linux
    Réponses: 4
    Dernier message: 03/05/2004, 22h34
  4. Réponses: 2
    Dernier message: 30/03/2004, 12h31
  5. Controler une chaine de caracteres ou d'entiers?
    Par Le druide dans le forum C
    Réponses: 6
    Dernier message: 25/09/2003, 09h48

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