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 :

Lire une ligne de caractères et de doubles avec sscanf


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Lire une ligne de caractères et de doubles avec sscanf
    Bonjour tout le monde ! Et à l'aide aussi !
    Je dois lire un fichier de la sorte :
    Si element
    227
    0.54300 0.54300 0.54300 90.00000 90.00000 90.00000
    1
    Si001 0.00000 0.00000 0.00000 1.00000
    Je me place à la bonne ligne, la cinquième, et j'obtiens la chaîne de caractère qu'elle contient grâce à fgets. Je voudrais maintenant avoir "char At=Si001;" et les 4 autres valeurs en double : double x=0,y=0,z=0,occup=1;

    Voici mon code (read_line me sort la chaîne de caractère de la ligne voulue) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(read_line(crystal,5),"%s %lf %lf %lf %lf",&At,&x,&y,&z,&occup);
    Mais ça marche pas ! Ca me sort "At=Si00è¤" et puis des nombres de merde pour tous les autres... Je ne comprends pas où est l'erreur, excusez ma nullitude... mais mes cours de C sont assez loin j'ai pourtant passé des heures à éplucher le forum et je n'ai pas trouvé de réponse qui marche...
    Pouvez-vous m'aider ???
    Merci d'avance,
    Colinou

  2. #2
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Pourtant, ceci marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(void)
    {
        char tab[] = "Si001 0.00000 0.00000 0.00000 1.00000";
        char At[10];
        double x,y,z,occup;
        sscanf(tab,"%s %lf %lf %lf %lf",At,&x,&y,&z,&occup);
        return 0;
    }
    Je suppose que ton paramètre At n'est pas un tableau (sans doute un simple pointeur)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse... en fait, je crois que le problème vient de la fonction read_line, vu qu'en effet, ça marche très bien autrement... mais je ne vois pas le problème non plus, vu que cette fonction est bien définie comme étant un char, et toutes mes variables sont bien définies...
    voici le 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include <math.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    char * read_line (char const * const s_filename, unsigned int i_line_num){
       FILE * p_file = NULL;
       char s_line [BUFSIZ];
       unsigned int cpt = 1;
       /* ----- Ouverture du fichier ----- */
       p_file = fopen (s_filename, "r");
     
       if (!p_file){
          /* Erreur: impossible d'ouvrir le fichier. */
          return NULL;
       }
       /* ----- Lecture de la ligne du fichier ----- */
       while (fgets (s_line, BUFSIZ, p_file)){
          if (cpt == i_line_num){
             /* La ligne a ete trouvee, on enleve le caractere
                de saut de ligne s'il est present. */
             char * p = strchr (s_line, '\n');
             if (p)
             {
                *p = 0;
             }
             /* On sort de la boucle. */
             break;
          }
          cpt++;
       }
    /* ----- Fermeture du fichier ----- */
       fclose (p_file);
       return s_line;
    }
     
    int main (){
        double x,y,z,occup;
        char * read_line();
        char crystal[50],At[10];
     
    /*...........*/
     
    sscanf(read_line(crystal,5),"%s %lf %lf %lf %lf",&At,&x,&y,&z,&occup);
    printf("%s\nAt=%s\nx=%lf\ny=%lf\nz=%lf\noccup=%lf\n",read_line(crystal,5),At,x,y,z,occup);
     
    return(0);
    }

    Merci de votre aide... je suis presque sur que c'est une erreur bidon qui traîne quelque part, mais je suis incapable de comprendre où...

  4. #4
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par colinou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char * read_line (char const * const s_filename, unsigned int i_line_num)
    {
       FILE * p_file = NULL;
       char s_line [BUFSIZ];
     
    ...
     
       return s_line;
    }
    La fonction read_line retourne l'adresse d'une variable locale, ce qui est incorrecte. En effet la memoire utilisee pour les variables locales est rendues a la sortie de la fonction et peut etre reutilisee.

    Il faut :
    * soit allouer dynamiquement s_line dans la fonction read_line (et bien penser a liberer dans la fonction appelante)
    * soit creer le tableau dans la fonction appelante et le fournir (ainsi que sa taille) en parametre de read_line.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Rah put***.... merci !!!!!!!!!!!!!!!!!!!!!!!!!!!!

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/10/2007, 20h45
  2. Lire une ligne puis l'effacer
    Par Battosaiii dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 11/12/2005, 18h50
  3. Lire une ligne
    Par slate dans le forum C
    Réponses: 11
    Dernier message: 26/11/2005, 21h50
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 05h37
  5. [TP]lire une ligne de l'ecran et la stocker dans une chaine
    Par Bleuarff dans le forum Turbo Pascal
    Réponses: 26
    Dernier message: 02/07/2002, 10h08

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