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 :

extraction d'un fichier txt dans une structure


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2015
    Messages : 105
    Points : 71
    Points
    71
    Par défaut extraction d'un fichier txt dans une structure
    Bonjour a tous;

    J'ai le code suivant, je souhaite récupérer les trois premières informations de mon fichier txt.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    struct application
    {
        char id[10];
        char descr [10];
        char owner [10];
    };
     
    int main()
     
    {
    int i=0;
    struct application tab[3];
    FILE*batch;
    batch=fopen("C:\\Documents and Settings\\gacia delamare\\Bureau\\loader_simple.txt","r");
        for(i=0;i<3;i++)
    {
        fgets(batch,"%s\n %s\n %s\n",&tab[i].id,&tab[i].descr,&tab[i].owner);
        printf("%s\n %s\ %s\n",tab[i].id,&tab[i].descr,&tab[i].owner);
    }
    }
    La compilation se passe bien mais cela bug quand je lance.

    Auriez vous une explication?

  2. #2
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,

    tu as confondu fscanf et fgets.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2015
    Messages : 105
    Points : 71
    Points
    71
    Par défaut
    Fgets ne permet pas de prendre toute une ligne?Dans mon cas, c'est mon souhait.

  4. #4
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Peux-tu me dire quels warnings le compilateur te donne ? N'y aurait-il pas des messages du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    warning: passing argument 1 of ‘fgets’ from incompatible pointer type [-Wincompatible-pointer-types]
         fgets(batch,"%s\n %s\n %s\n",&tab[i].id,&tab[i].descr,&tab[i].owner);
    note: expected ‘char * restrict’ but argument is of type ‘FILE * {aka struct _IO_FILE *}extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
    Le compilateur te dit que tu utilises mal la fonction fgets, et c'est normal car les paramètres que tu lui donnes sont ceux qu'on attend pour la fonction fscanf.

    Il faut toujours lire et comprendre ce que le compilateur te dit ...

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2015
    Messages : 105
    Points : 71
    Points
    71
    Par défaut
    Tu as tout a fait raison picodev , en remplaçant par fscanf cela marche très bien.mais peut alors m'expliquer pourquoi avec scanf il lit toute la ligne?

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    A priori, parce que scanf lit une entrée formatée, et que tu as des '\n' dans le format de lecture.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2015
    Messages : 105
    Points : 71
    Points
    71
    Par défaut
    Merci leternel

    Alors, en faisant honneur a ta citation pour deux choses :

    1) tu dis que le format de sortie change quelque chose sur l'entrée : je n'arrive pas à comprendre.

    2)Je souhaite prendre la ligne a partir d'un caractère spécial type ( ou :.Je sais qu'en utlisant les pointeurs et avec des soustraction de ceux ci, on peut y arriver mais il y a t-il un moyen moins lourd?

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    scanf est une fonction de lecture, tu lui dit ce que tu t'attends à trouver, et il modifie des variables en conséquence.
    Si tu lui dis "%s\n%s", il cherche tout ce qu'il peut jusqu'à un '\n', et le met dans une chaine de caractère (espérons que ton buffer soit assez grand.), puis saute ce caractère (de fin de ligne) et lit encore une autre chaine.

    à partir de là, il faut lire la documentation de *scanf, pour avoir les détails exacts.
    Tu pourras la trouver, par exemple, sur cppreference.com.

    Je ne me souviens plus des détails, et quitte à copier la doc, autant t'y envoyer
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  9. #9
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2015
    Messages : 105
    Points : 71
    Points
    71
    Par défaut
    Merci beaucoup cela marche vraiment bien.Pensez vous que je puisse non pas commencer a copier a la ligne mais depuis un caractère de ponctuation sans avoir a recourir aux pointeurs?

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

Discussions similaires

  1. importer un fichier .txt dans une table
    Par caracas dans le forum Administration
    Réponses: 2
    Dernier message: 31/07/2007, 21h19
  2. [DDE]Import fichier .txt dans une base Access
    Par stoonman dans le forum Access
    Réponses: 3
    Dernier message: 23/03/2007, 19h08
  3. Réponses: 8
    Dernier message: 28/12/2006, 14h18
  4. importation d'un fichier txt dans une table
    Par pierre.egaud dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/09/2006, 16h26
  5. ligne de fichier txt dans une variable
    Par suya95 dans le forum Langage
    Réponses: 2
    Dernier message: 25/07/2006, 10h14

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