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 :

fgets + scanf et gestion des espaces


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Par défaut fgets + scanf et gestion des espaces
    Bonjour,

    Voilà mon prblème :

    J'ai un fichier texte que je lis ligne par ligne

    par exemple j'ai une ligne qui fait : "aa bb cc dd ee ff gg"

    aa bb cc et dd sont des informations utiles que je dois séparer et ee ff et gg font partis du même champs

    Je fais d'abord mon fgets :
    et ensuite mon sscanf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(temp,"%s %s %s %s %s",chaine1,chaine2,chaine3,chaine4,chaine5);
    Donc ici dans chaine1, j'ai "aa", dans chaine2, j'ai "bb", dans chaine3, j'ai "cc", dans chaine4, j'ai "dd" et dans chainee5, j'ai "ee"

    par contre ce que je voudrais c'est avoir "ee ff gg" dans chaine5 .....

    Donc est-ce qu'il existe une fonction qui met tout le reste de la ligne prise par le fgets dans une chaine ?

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Par défaut
    dois-tu forcément utiliser sscanf, il me semble que le scanf en générale ne prenne pas les espaces ?

    Les données présentent dans ton fichier sont toujours formatées du style :

    XX XX XX XX YY YY YY ?

    Une fois que tu as lu ton fichier (son contenu...) tu pourrait traiter via, je ne sais pas, peut-être à coup de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char *pt;
    pt=temp;
    strncpy(chaine1,pt,  strcspn(pt," "));
    pt+=strcspn(pt," ")+1;

    Cela pourrait fonctionner

    A tester, mais je complique un peut il doit y avoir possibilité de faire quelque chose de simple avec des boucles et des conditions (IF ou bien un petit SWITCH).


    Sinon si tu veux juste mettre le reste de la ligne tu peux aussi bien faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    char *pt;
    int bLen;
    pt=temp;
     
    bLen=strlen(chaine1)+strlen(chaine2)+strlen(chaine3)+strlen(chaine4)+4;
    //ajoute +4 pour les 4 espaces
     
    //incrémente ton pointeur pour arriver sur la partie qui te convient
    for(cpt=0;cpt<bLen;cpt++,pt++);
     
    //chope la partie de string que tu veux
    strcpy(chaine5,pt);

    Bonne chance !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Par défaut
    En gros le type de fichier que je dois traiter sont des export de fichiers pcap de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          1 0.000000000    HTTP     62.201.129.225        10.160.152.16         http-alt 52828  1414   Continuation or non-HTTP traffic
          2 0.000026000    HTTP     62.201.129.225        10.160.152.16         http-alt 52828  1414   Continuation or non-HTTP traffic
          3 0.000033000    HTTP     62.201.129.226        10.161.40.152         http-alt 20805  639    HTTP/1.1 200 OK  (GIF89a)
          4 0.000124000    HTTP     10.161.41.241         62.201.129.225        19359  http-alt 762    GET http://bp-blog.skyrock.com/img/skychat_xhtml-a/messages.gif HTTP/1.1 
          5 0.000132000    TCP      10.160.177.135        62.201.129.226        34425  http-alt 66     34425 > http-alt [FIN, ACK] Seq=1 Ack=1 Win=63977 Len=0 TSV=60571976 TSER=984328855
    Donc on a un champ avec le numéro, puis le temps, le protocol, deux ips, une taille de packet et finalement la zone qui me pose problème la zone avec des informations complémentaires qui contient des espaces : /

    J'ai checké tes deux fonctions : strncpy et strcspn et elles ont l'air sympas Je vais voir ce que je peux en faire. Mais bon je pense que le fait qu'il y ait plusieurs espaces parfois peut poser problème.

    Merci

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je pense que le mieux dans ce cas, c'est lecture des fichiers ligne par ligne avec fgets() et ensuite analyse/parsing de ces lignes avec strtok().

    Tu as de la chance, ton format de ligne est assez simple et les paramètres avec nombres d'espaces variables sont en fin de ligne

    Sinon, l'autre option, c'est les expressions régulières (avec regcomp() et un petit tuto ici).

    C'est un peu plus long/délicat à mettre en oeuvre mais cela résoud tous les problèmes en cas de modification du format de ta ligne
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sscanf(temp,"%s %s %s %s %[^\n]s",chaine1,chaine2,chaine3,chaine4,chaine5);

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Par défaut
    Merci ssmario2 je connaissais pas la syntaxe %[^\n]s mais ça marche plutôt pas mal

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/04/2012, 13h53
  2. [XSLT] Gestion des espaces, tabulations et retours à la ligne
    Par Pragmateek dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 15/05/2008, 15h47
  3. DataSet typé / Gestion des espaces sur clés
    Par sandre dans le forum Windows Forms
    Réponses: 8
    Dernier message: 17/09/2007, 10h07
  4. Gestion des espaces temporaires
    Par pholos dans le forum Administration
    Réponses: 3
    Dernier message: 07/06/2007, 09h23
  5. [VBS] Gestion des espaces dans le chemin de fichiers
    Par Edoxituz dans le forum VBScript
    Réponses: 4
    Dernier message: 23/02/2006, 16h41

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