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 :

remplacer fopen par fscanf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Par défaut remplacer fopen par fscanf
    Bonjour,
    j'aimerai modifier un programme afin qu'il ne lise plus des informations à partir d'un nom de fichier spécifié comme suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if((finputp=fopen(datafilename,"r"))!=NULL)
    { /* traitement du fichier */
    fclose(finputp);
    }
    else {    /*if cannot open filename*/
    sprintf(smess,"\nError in reading data set file :\n\tCannot open file %s",datafilename);
    write(ERRORFILE,smess);
    exit(1);
    }/*end of else*/
    exit(1);
    car les données à traiter, habituellement envoyés vers "datafilename" seront directement issues de l'entrée standard, pour pouvoir utiliser un pipe.

    Pour le moment je n'y arrive pas...est-ce que vous avez une solution SVP ?

    myca

  2. #2
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    tu n'est pas obligé d'utiliser fscanf. tu peux tout aussi bien utiliser directement fgets, qui te renvoie une ligne d'un flux (l'entrée standard en l'occurence). Et plus besoin de fopen.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Par défaut
    Merci beaucoup Marvin, ça entraine un changement vers le mieux j'ai l'impression, lorsque j'ai remplacé le code précedent par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if((fgets(finputp,sizeof(finputp), stdin))!=NULL)
    { /* traitement du fichier */
    fclose(finputp);
    }
    else {    /*if cannot open filename*/
    sprintf(smess,"\nError in reading data set file :\n\tCannot open file %s",datafilename);
    write(ERRORFILE,smess);
    exit(1);
    }/*end of else*/
    exit(1);
    Mais ça entraine une erreur de segmentation, chose à laquelle je ne suis pas familier. Je tiens juste à préciser que je ne suis pas informaticien mais que mon job m'ammène à bricoler des scripts à gauche à droite....

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Les prototypes des fonctions int fclose (FILE *stream); et char * fgets (char * s, int size, FILE * stream); ne sont pas en cohérence. Il faut que tu revois l'utilisation de fgets.

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    finutp est-il initialisé et alloué. En gros si c'est un buffer déclarer de la façon suivante :
    Dans ce cas il faut utiliser la fonction malloc pour l'allouer.
    s'il est déclarer de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char finutp[UNE_TAILLE];
    ben je sait pas pourquoi ça segfault. (Au passage une Segmentation Fault veux dire que tu écris dans un espace mémoire que tu n'as pas alloué).

    EDIT:
    Les prototypes des fonctions int fclose (FILE *stream); et char * fgets (char * s, int size, FILE * stream); ne sont pas en cohérence. Il faut que tu revois l'utilisation de fgets.
    Ah oui il y a aussi ça. en fait comme tu n'ouvre plus de fichier, tu n'as plus besoin de fclose.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Par défaut
    ok pour le fgets, je comprends un peu mieux l'histoire du close qui est devenu
    Pour l'allocation de mémoire, j'ai beaucoup de boulot alors pour saisir ce qu'il se passe.
    Naïvement j'ai tenté de faire un
    dans les déclarations au début de mail en me disant que ça allait être assez grand, mais "segmentation fault" tout de même.
    Du coup, à bosser. C'est chiant cette histoire de mémoire !
    merci pour les pistes

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Salut,

    Pourrais-tu poster un morceau de code compilable, même s'il ne compile pas, pour voir un peu l'ensemble des problèmes.

    Avec mes meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 838
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mycaweb Voir le message
    Merci beaucoup Marvin, ça entraine un changement vers le mieux j'ai l'impression, lorsque j'ai remplacé le code précedent par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if((fgets(finputp,sizeof(finputp), stdin))!=NULL)
    { /* traitement du fichier */
    fclose(finputp);
    }
    Mais ça entraine une erreur de segmentation, chose à laquelle je ne suis pas familier. Je tiens juste à préciser que je ne suis pas informaticien mais que mon job m'ammène à bricoler des scripts à gauche à droite....
    Olà Tornado, je crois que tu mélanges plein de notions...
    fgets() te permet de lire un flux entrant et stocker l'info dans une zone mémoire de type "chaine de caractères". Donc si tu veux lire un fichier, la structure de base est la suivante
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char zone[nnn + 1];
    FILE *fp;
    fp=fopen("fichier", "r");
    while (fgets(zone, nnn + 1, fp) != NULL)
    {
        // traitement de la zone
    }
    fclose(fp);

    Maintenant, si tu veux lire stdin (qui reste un flux) alors la structure se simplifie en
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char zone[nnn + 1];
    while (fgets(zone, nnn + 1, stdin) != NULL)
    {
        // traitement de la zone
    }

    Mais placer finputp (qui me semblait dans le premier code être un flux) en tant que zone réceptrice dans le second code ne peut pas marcher...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Par défaut
    je l'essaye de suite

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/01/2006, 12h02
  2. Remplacer null par...
    Par HichamK dans le forum Oracle
    Réponses: 4
    Dernier message: 17/01/2006, 13h56
  3. Réponses: 2
    Dernier message: 14/11/2005, 13h33
  4. [Configuration] remplacement des é par des i
    Par illegalsene dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 18/10/2005, 16h37
  5. [ASP] include remplacer chemin par variable
    Par damn dans le forum ASP
    Réponses: 3
    Dernier message: 01/10/2004, 15h27

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