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 :

Problème avec fscanf


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 60
    Par défaut Problème avec fscanf
    Bonjour,

    j'aimerai lire dans un fichier une ligne avec fscanf mais je n'y arrive pas (correctement tout du moins...)

    Le fichier s'appelle networks et respecte le format suivant:
    <site1_192.168.1.0_255.255.255.0>
    <site2_192.168.2.0_255.255.255.0>

    mon code est le suivant (pour lire au moins la première ligne):

    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
     
     
     fd=fopen("/home/networks","r");
     
     if(fd<0)
       exit(-1);
     
     //printf("ok\n");
     
     char site[128];
     char netw[20];
     char netm[20];
     fscanf(fd,"<%s_%s_%s>",site,netw,netm);
     printf("site=%s, netw=%s, netm=%s",site,netw,netm);
     fclose(fd);
    je voudrai site=machine1, netw=192.168.1.0, netm=255.255.248.0

    mais au lieu de cela j'ai :

    site=machine1_192.168.1.0_255.255.248.0>, netw=����, netm=

    peut être que je n'utilise pas correctement fscanf?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut
    salut,

    Dans le man (http://www.linuxcertif.com/man/3/fscanf/), il est dit que lorsqu'on récupère une string avec %s le caractère d'apres doit être blanc
    Correspond à une séquence de caractères différents des caractères blancs. Le pointeur correspondant doit être un pointeur sur un tableau de caractères qui doit être assez large pour accueillir toute la séquence d'entrée, ainsi que l'octet nul final (« \0 ») qui est ajouté automatiquement. La conversion s'arrête au premier caractère blanc, ou à la longueur maximale du champ.
    en remplaçant tes '_' avec ' ', ça marche mais ça répond peut être pas a ta problématique si le format t'es imposé

  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
    le %s lit une chaîne terminée par un séparateur (blanc, fin de ligne,...)
    Tu veux l'arrêter sur _ et la dernière sur > :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(fd, "<%[^_]_%[^_]_%[^>]>",site,netw,netm);

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 60
    Par défaut
    Ok, je ne peux pas me connecter sur la machine où il y a mes sources ce soir mais j'essaiera cela demain. Merci à vous deux.

    diogene--> je n'ai pas besoin de spécifier le format %s dans ce que tu as écrit? Ca marche quand même?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 60
    Par défaut
    ok ça marche, mais je n'arrive pas a lire plusieurs lignes différentes dans le fichier.
    chaque ligne se termine par un \n, sauf la dernière, comment je peux faire?


    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
     
     char c;
     char site[128];
     char netw[20];
     char netm[20];
     
     int code;
     
     while((c=fscanf(fd,"<%[^_]_%[^_]_%[^>]>",site,netw,netm))!=EOF);
     
      {
             printf("code =%d\n",code);
             printf("site=%s netw=%s, netm=%s",site,netw,netm);
      }
     fclose(fd);

  6. #6
    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
    Il faut éliminer le caractère de fin de ligne pour passer à la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(fscanf(f,"<%[^_]_%[^_]_%[^>]>\n",site,netw,netm)!=EOF)

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 60
    Par défaut
    Salut, j'ai essayé mais ça ne marche pas, enfin, ça ne récupère que la dernière ligne du fichier à chaque fois.

    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
     
    #include <errno.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <stdint.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    #include <fcntl.h>
     
    int main(int argc, char **argv)
    {
     
     FILE* fd;
     fd=fopen("networks","r");
     
     if(fd==NULL)
       exit(-1);
     
     char c;
     char site[128];
     char netw[20];
     char netm[20];
     
     int code;
     
     while((fscanf(fd,"%s %s %s \n",site,netw,netm))!=EOF);
     {
       printf("site=%s netw=%s, netm=%s\n",site,netw,netm);
     }
     
     fclose(fd);
     
     return 0;
    }
    J'ai enlever les < _ pour que ce soit plus simple, et je n'arrive que à afficher la dernière ligne du fichier

  8. #8
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    pourquoi se compliquer la vie ??,

    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
    char ligne[100] ;
    char *p1 ;
     
    while ( fgets(Ligne, 100, fd) != NULL )
    {
        p1  = strtok ( Ligne, "><_\n" );
        strcpy ( site, p1 );
     
        p1  = strtok ( NULL, "><_\n" );
        strcpy ( netw, p1 );
     
        p1  = strtok ( NULL, "><_\n" );
        strcpy ( netm, p1 );
     
        fprintf ( stderr, "Site %s  netw %s netm %s \n", site, netw, netm);
    }

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par lilmeth Voir le message
    Salut, j'ai essayé mais ça ne marche pas, enfin, ça ne récupère que la dernière ligne du fichier à chaque fois.
    Enlève le point virgule a la fin de la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((fscanf(fd,"%s %s %s \n",site,netw,netm))!=EOF);
    Car la le code boucle et ne fait rien.

Discussions similaires

  1. Problème lecture fichier avec fscanf
    Par hypto dans le forum C
    Réponses: 7
    Dernier message: 18/11/2013, 16h57
  2. Problème avec fscanf, bug ?
    Par alainlc dans le forum Bibliothèque standard
    Réponses: 10
    Dernier message: 27/03/2008, 16h54
  3. Problème avec fscanf
    Par Bebert71 dans le forum C
    Réponses: 2
    Dernier message: 08/01/2007, 19h09
  4. Problème avec fscanf
    Par renlel dans le forum C++
    Réponses: 7
    Dernier message: 26/07/2006, 12h47
  5. Problème de lecture d'entête BMP avec "fscanf".
    Par Pragmateek dans le forum C
    Réponses: 8
    Dernier message: 26/06/2006, 09h08

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