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 :

fscanf et fichier de config


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut fscanf et fichier de config
    Bonjour,

    tout d'abords ne vous inquiétez pas, j'ai vraiment parcouru ce forum avant de poster.

    Bref, voici mon problème,
    j'ai un fichier de config : "services.conf"

    time 13 stream tcp nowait internal
    echo 7 stream udp nowait internal
    tftp 69 dgram udp wait /usr/sbin/tcpd in.tftpd
    pop-3 110 stream tcp nowait /usr/sbin/tcpd ipop3 -l -gt

    que je dois scanner pour récupérer ça dans des variables

    voici mon code :

    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
     #include <stdio.h>
    #include <stdlib.h>
     
     
    int main (){ 
     
     FILE* fichier_conf ;
     
    int nb=0;
    int port;
    char nom[20];
    char tcp[4];
    char protocol[7];
    char wait[11];
    char cheminServeur[30];
    char argumentsServeur[30];
     
    if ((fichier_conf = fopen ("services.conf", "r"))== NULL)
        perror("fichier inexistant");
     
      while (fscanf(fichier_conf, "%s%d%s%s%s%s%[^\n]", nom, &port, tcp, protocol, wait, cheminServeur, argumentsServeur)!=EOF){
     
        printf ("%s %d %s %s %s ---|%s|---  ---|%s|--- \n", nom, port, tcp, protocol, wait, cheminServeur, argumentsServeur);
        nb++;	
      }
     
    fclose (fichier_conf);
    exit(EXIT_SUCCESS);
    }
    Alors mon problème :

    le dernier argument : <argumentsServeur> pose problème car je dois récupérer les espaces avec

    quelle serait l'expression régulière pour ça ?
    car celle là me renvoit :

    pop-3 28001 stream tcp nowait ---|/usr/sbin/tcpd|--- ---| ipop3 -l -gt|---

    pour la dernière ligne par exemple, bref l'espace reste dans l'argument et ça m'embête.

    Ensuite,
    je pense avoir de gros problème de gestion de mémoire car :
    -si je change le int port; au tout début et que je le mets après tous les char par exemple,
    mon programme boucle indéfiniment ou fait des erreurs de segmentation selon comment j'organise les déclarations ...

    J'ai aussi des problème de chevauchement de données dans mes variables de mon fichiers original qui utilise des strcpy pour remplir des champs de structures.
    Bref des soucis mémoires que je ne sais pas régler

    Si quelqu'un connait bien le principe de fonctionnement de fscanf je serais preneur de quelques conseils
    et si quelqu'un maitrise les ER pour me choper ce dernier champs ça m'arrangerait aussi

    Voilà, merci d'avance à vous

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Par défaut
    fscanf n'utilise pas d'expression régulière : je te conseille la page de man ad-hoc qui explique les directives et leur interprétation.

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    1- Le tableau tcp de 4 char est trop petit : il doit pouvoir recevoir les chaines "stream" ou "dgram"

    2- Avant de passer au format %[^\n], il faut éliminer les blancs qui précèdent le dernier argument :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(fichier_conf, "%s%d%s%s%s%s %[^\n]", ......

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut
    ok merci, ça a résolu le problème de l'espace avant (incompréhensible car j'avais déjà essayé et j'avais toujours des erreures.

    Bref j'ai toujours le problème des serveurs "internal" sans arguments donc.

    Le scanf me renvoit n'importe quoi, comment je pourrait faire pour dire d'ignorer ce champ lorsqu'il n'y a pas d'argumentsServeur ?

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    En modifiant le format pour enlever explicitement les blancs sans pour autant enlever le '\n' de la ligne et en comptant les conversions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      while ((count = fscanf(fichier_conf, "%s%d%s%s%s%s%*[ ]%[^\n]", nom, &port, tcp, protocol, wait, cheminServeur, argumentsServeur))!=EOF){
     
        if(count == 7)printf ("%s %d %s %s %s <%s>  <%s> \n", nom, port, tcp, protocol, wait, cheminServeur, argumentsServeur);
        else if(count == 6)printf ("%s %d %s %s %s <%s> \n", nom, port, tcp, protocol, wait, cheminServeur);
        else printf("Erreur\n");
        nb++;
      }
    Il peut être également utile de mettre un '\0' en tête de argumentsServeur[] avant chaque lecture, comme ça si le paramètre est absent, la chaine correspondante sera vide.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut
    ok merci beaucoup,
    problème résolu

    sinon j'ai découvert une fonction très utile toute faites : strtok ( ... )

    pour ceux qui ont ce genre de problème ...

Discussions similaires

  1. [jdbc] fichier de config
    Par calimero82 dans le forum JDBC
    Réponses: 14
    Dernier message: 21/06/2005, 13h48
  2. [Erreur]impossible de trouver le fichier de config du moteur
    Par julietteste dans le forum Bases de données
    Réponses: 5
    Dernier message: 10/05/2005, 18h34
  3. [C#] Section appSettings du fichier Web.config
    Par pbo dans le forum ASP.NET
    Réponses: 2
    Dernier message: 01/02/2005, 10h12
  4. [struts] utilisation de plusieurs fichiers de config
    Par Boosters dans le forum Struts 1
    Réponses: 4
    Dernier message: 25/03/2004, 10h04
  5. fichier de config: refuse tcpip_socket=true.
    Par phil25 dans le forum Installation
    Réponses: 1
    Dernier message: 04/01/2004, 15h55

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