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 :

Extraction de données dans chaîne de caractère


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Par défaut Extraction de données dans chaîne de caractère
    Bonjour,

    je souhaite extraire un nombre variable de valeur d'une chaîne de caractère issue d'un fichier (correspondant à une ligne du fichier).

    Par exemple :
    0 32 7 9 3
    2 997 6
    1 3 2200

    Je connais le nombre de valeurs qu'il y a par ligne. J'ai essayé le code suivant (simplifié) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int temp;
    char str_in[5000];
    for(i=0; i<nb_lignes; i++) { // parcourir chaque ligne du fichier
        fgets(str_in, 5000, fp); // fp est le pointeur vers mon fichier
        for(j=0; j<nb_valeur[i]; j++) { // pour chaque valeur d'une ligne
            sscanf(str_in, "%i ", &temp);
        }
    }
    Le problème est que je lis toujours la première valeur de chaque ligne. Est-ce que quelqu'un a un conseil à me donner pour faire fonctionner ce code ?

    Merci d'avance.

  2. #2
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Bonjour,

    Il faut lire puis se décaler.

    Cf : strchr, strstr.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Par défaut
    Merci uknow. Je comprends bien le problème. J'ai essayé de "décaler" la chaîne de caractère avec strchr mais je ne suis pas très habitué avec la manipulation de ce type de variable et ça me retourne une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int temp;
    char str_in[5000];
    for(i=0; i<nb_lignes; i++) { // parcourir chaque ligne du fichier
        fgets(str_in, 5000, fp); // fp est le pointeur vers mon fichier
        for(j=0; j<nb_valeur[i]; j++) { // pour chaque valeur d'une ligne
            sscanf(str_in, "%i ", &temp);
            str_in = strchr(str_in, ' ');
        }
    }

  4. #4
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonjour,

    Voici un morceau de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        while(!feof(fp)) {
            if(fscanf(fp, "%d ", &value)>0)  // Égale à 1 si une valeur a été trouvée.
                printf("%d ", value) ;
            else
                fgets(ligne, 128, fp) ;  // Lire la fin de la ligne
        }
    Le fscanf va "décoder" chaque nombre du fichier. Si fscanf retourne une "erreur" (0 nombre trouvé), alors on lit la fin de ligne, et l'on passe à la suivante.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Par défaut
    J'ai oublié de signaler que j'ai une contrainte supplémentaire qui est que je dois garder une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(i=0; i<nb_lignes; i++) { // parcourir chaque ligne du fichier
        for(j=0; j<nb_valeur[i]; j++) { // pour chaque valeur d'une ligne
     
        }
    }
    Si je comprends bien ton code Elijha, je ne sais plus si j'ai lu la valeur sur la même ligne que la précédente ?

  6. #6
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Effectivement, tu n'a pas le numéro de la ligne.

    Mais rien t'empêche de faire comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(i=0; i<nb_lignes; i++) { // parcourir chaque ligne du fichier
        for(j=0; j<nb_valeur[i]; j++) { // pour chaque valeur d'une ligne
            if(fscanf(fd, "%d ", &temp)>0)
                printf("%d ", temp) ;
            else
                fgets(ligne, 128, fp) ;  // Lire la fin de la ligne
        }
        printf("\n") ;   // Fin de ligne
    }
    (Attention, je n'ai pas testé ce code).

  7. #7
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Citation Envoyé par julieng31 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char str_in[5000];
     
    str_in = strchr(str_in, ' ');
    Oui c'est normale car strchr retourne un char *, or toi tu essaies d'assigner un char * à un char[] ce n'est pas possible. Le type tableau n'est pas une lvalue modifiable; en d'autres termes, tu ne peux pas assigner quelque chose à un tableau.

    Par conséquent, tu dois déclarer un pointeur intermédiaire comme étant un type char *.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int temp;
    char str_in[5000];
    char * cursor = str_in;
     
    for(i=0; i<nb_lignes; i++) { // parcourir chaque ligne du fichier
        fgets(str_in, 5000, fp); // fp est le pointeur vers mon fichier
     
        for(j=0; j<nb_valeur[i]; j++) { // pour chaque valeur d'une ligne
            sscanf(cursor, "%i ", &temp);
            cursor = strchr(cursor + 1, ' ');
        }
    }

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Par défaut
    Merci à tous pour votre aide, le code d'Uknow fonctionne bien !

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

Discussions similaires

  1. extraction de données dans excel
    Par massilia80 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/10/2006, 12h14
  2. Extraction de données dans un fichier texte en VB6 !
    Par rockroa dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/06/2006, 16h00
  3. extraction des données dans une table Access
    Par moabomotal dans le forum Access
    Réponses: 2
    Dernier message: 26/05/2006, 11h17
  4. Extraction de donnés dans un fichier XML
    Par ANISSS dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 27/01/2006, 13h16
  5. nombre de répétitions dans chaînes de caractères
    Par jocarina dans le forum Langage SQL
    Réponses: 10
    Dernier message: 20/06/2005, 13h07

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