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 :

[newbie] fonction fopen et fscanf


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Points : 18
    Points
    18
    Par défaut [newbie] fonction fopen et fscanf
    Bonjour,

    J'ai un fichier toto.txt avec 2 lignes.
    Je souhaite récupérer chacune d'elle dans des variables. Le contenu de l'une d'entre-elle doit passer un test de comparaison avec un entier (int test passé en argument). Le fichier est traité dans l'appel d'une fonction (lecture_fichier). Si le test est validé, un retour doit être transmis au code principal.

    Voici un premier jet :

    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
     
    void lecture_fichier(int test)
    {
       char *name = "toto.txt";   
       char valeur1[4];
       char valeur2[BUFSIZ];
       FILE *file;
     
       if ((file = fopen ( name, "r" )) == NULL)
       perror ("Impossible d'ouvrir le fichier.");
       else
       {
          while ( fscanf ( file, "%s %s", valeur1, valeur2 ) == 2)
          printf("%s\n%s\n", valeur1, valeur2);
       fclose ( file );
       }
    }
    Mes questions sont les suivantes :

    - je ne sais pas dans quelle mesure l'utilisation de la fonction fscanf est optimale et s'il n'existe pas une solution alternative plus propre ?

    - lors de mon test, je vais avoir un problème de comparaison entre un pointeur et un entier et je ne sais pas comment pallier à ce problème.

    - enfin, comment dois-je intégrer à ma fonction le retour du test qui sera récupérer par le code principal ?

    Merci bien pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    T'as sur chaque ligne du fichier deux valeurs séparées par un espace ?
    Si c'est ça, t'es pas obligé de passer par une chaine, tu peux lire directement un entier. En plus comme tu l'as écrit, si tes chaines dépassent 4 ou BUFSIZ en taille, ça va planter.
    Pour le test, tu peux renvoyer en entier 0 si le test est validé. En général on utilise 0 pour signifier un succès, comme ça on peut utiliser toutes les autres valeurs non nulles pour tous les cas d'échec.
    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
    int lecture_fichier(int test)
    {
       char *name = "toto.txt";   
       int valeur1;
       int valeur2;
       FILE *file;
       
       if ((file = fopen ( name, "r" )) == NULL)
      {
       perror ("Impossible d'ouvrir le fichier.");
       return -1;
      }
       else
       {
          while ( fscanf ( file, "%d %d", valeur1, valeur2 ) == 2)
          printf("%d\n%d\n", valeur1, valeur2);
          fclose ( file );
        if(valeur1==test)
          return 0;
        else
          return -1;
       }
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Points : 18
    Points
    18
    Par défaut
    Merci bien Gastiflex pour ce regard éclairé associé à des explications simples.
    Le raisonnement m'apparait cohérent mais cela me retourne :

    attention : format ‘%d’ expects type ‘int *’, but argument 3 has type ‘int’
    attention : format ‘%d’ expects type ‘int *’, but argument 4 has type ‘int’

    sur la ligne while ( fscanf ...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Points : 18
    Points
    18
    Par défaut
    Ne faut-il pas écrire ?

    while ( fscanf ( file, "%d %d", &valeur1, &valeur2 ) == 2)

  5. #5
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    Bonjour,

    oui c est ca, tu dois passer une adresse.
    "vaste programme"

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Points : 18
    Points
    18
    Par défaut
    Cela fonctionne effectivement mieux avec. Merci BainE pour la confirmation.

Discussions similaires

  1. problème de chemin avec la fonction fopen
    Par stars333 dans le forum Langage
    Réponses: 3
    Dernier message: 10/05/2007, 20h39
  2. problème avec la fonction fopen
    Par single dans le forum Langage
    Réponses: 5
    Dernier message: 24/03/2007, 11h40
  3. fonction Fopen
    Par TheOrY dans le forum Langage
    Réponses: 4
    Dernier message: 04/02/2007, 10h42
  4. Que renvoie la fonction fopen?
    Par PorkyFighter dans le forum C
    Réponses: 11
    Dernier message: 17/10/2006, 00h15
  5. [PLSQL HP3000] Fonction FOPEN
    Par anaon dans le forum Oracle
    Réponses: 6
    Dernier message: 06/10/2005, 09h50

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