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 :

Pouvez vous m'expliquer?


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut Pouvez vous m'expliquer?
    Bonjour a tous

    1/ Comment récupérer l'entier qui nous place à la position 0 dans le fichier si ce prototype renvoie rien?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void rewind(FILE* pointeurSurFichier);
    2/
    Citation d'un totorial :
    Ce schéma montre que la chaîne écrite par fgets était "Mateo\n\0". Nous avons remplacé le \n par un \0, ce qui a donné au final : "Mateo\0\0".
    Ce n'est pas grave d'avoir deux \0 d'affilée. L'ordinateur s'arrête au premier \0 qu'il rencontre et considère que la chaîne de caractères s'arrête là.
    Il y a un problème dans ce qu'il dit car si j'alloue un tableau de 6 char et j'entre le mot "Salut" alors il y aura "Salut\n\o" et même si je remplace \n par \0 j'aurais "Salut\0\0" donc débordement ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    1. Faire un ftell() après le rewind() ?
    2. C'est un problème au niveau taille du buffer, mais pas au niveau lecture de celui-ci. Après tout, si tu copies la chaîne, tu ne copieras que le premier caractère nul...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  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
    1- La position courante est un élément de la structure opaque FILE. La fonction rewind() remet la position courante du fichier passé en argument au début de ce fichier.


    2- Si tu as un tableau de 6 char, alors il peut contenir la chaine "Salut", mais pas la chaine "Salut\n". Tu n'y peux rien, sauf redimensionner le tableau à 7.

    Note : le '\n' est mis par fgets() dans la chaine si il figure dans l'entrée lue (au contraire de gets(), mais cette fonction est obsolète)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut
    Merci..


    Pour la 2eme question il est dit pour ce code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        int main(int argc, char *argv[])
     {
           char nom[10];
     
           printf("Quel est votre nom ? " );
           lire(nom, 10);
           printf("Ah ! Vous vous appelez donc %s !\n\n", nom);
     
           return 0;
       }

    La fonction fgets étant sécurisée, elle s'est arrêtée de lire au bout du 9ème caractère, car nous avions alloué un tableau de 10 char (il ne faut pas oublier le caractère de fin de chaîne \0 qui occupe la 10ème position).
    Le problème, c'est que le reste de la chaîne qui n'a pas pu être lu, à savoir "ard Alber 1er", n'a pas disparu ! Il est toujours dans le buffer.
    Résultat:
    Quel est votre nom ? Jean Edouard Albert 1er
    Ah ! Vous vous appelez donc Jean Edou !


    Mais pourquoi il dit que la fonction fgets s'est arrêtée de lire au bout du 9ème caractère, car ce que j'ai compris c'est que fgets s'arrête au 8ème caractère, le 9ème étant "\n" et la 10ème "\0" ??

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Si tu saisis trop de caractères pour le buffer, le \n n'est pas mis dedans.

    C'est comme ça qu'on peut savoir si l'on doit faire le ménage dans le flux d'entrée: Si l'on n'a pas le \n dans le buffer, c'est que la ligne était trop longue et il faut faire le ménage.

    Un exemple ici: http://www.developpez.net/forums/d77...s/#post4460243
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut
    Merci..

    Si j'ai bien compris le "\n" se trouve a la fin de Jean Edouard Albert 1er car on a appuyé sur la touche entré et non a la fin de Jean Edou ??

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    On va dire que oui.

    Résultat, si tu refais un fgets() juste après sans nettoyer entre temps, tu auras droit à "art albert 1er\n" (en supposant que le second fgets() se fasse sur un buffer assez grand).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    On va dire que oui.
    Pourquoi c'est pas totalement vrai ?

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    "car on a appuyé sur la touche Entrée" n'a pas vraiment de sens, parce que tant que tu ne presseras pas cette touche, tu n'auras rien de toute façon.

    En fait, c'est la formulation de ta phrase qui est bizarre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut
    C'est parfait ! j'ai compris..

    Est ce que cela est juste ?

    Exemple :

    Jean Edouard Albert 1er\n\0 ---> Avant l'appel de la fonction strchr

    Jean Edouard Albert 1er\0\0 ---> Après l'appel de la fonction strchr (pour remplacer \n par \0)

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    C'est juste, si le buffer est assez grand pour tout contenir.

    Sinon, tu as:
    • "Jean Edou\0" dans le buffer
    • "ard Albert 1er\n" dans le flux, avant vidange (voir message #5) (le flux ne contient pas le caractère nul, c'est fgets() qui l'ajoute automatiqument).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut
    Oui..

    Je voulais dire que j'alloue un tableau de 50 char et j'écris avec fgets "Jean Edouard Albert 1er"

    Est ce que Jean Edouard Albert 1er\n\0 sera comme comme ça avant l'appel de la fonction strchr et est ce qu'après l'appel de la fonction strchr (pour remplacer \n par \0) il deviendra comme ça Jean Edouard Albert 1er\0\0 ?

    PS: j'ai 16 ans et j'arrive pas bien a m'expliqué

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Oui. Sauf que la lecture s'arrêtera au premier \0, donc le second ne sera plus jamais vu.

    Je rappelle à ce sujet que strchr() ne fait qu'indiquer où se trouve le \n; le véritable remplacement par \0 est fait quelques lignes plus bas.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut
    ok ok

    Donc il y aura 2 "\0\0" et la lecture s'arrêtera au premier \0 qu'il rencontre et considère que la chaîne de caractères s'arrête là.. ?

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Oui.

    Le second \0 n'a désormais pas plus d'importance que les caractères non-initialisés à la fin du buffer.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Par défaut
    Merci..

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 28/04/2010, 16h33
  2. pouvez vous m'expliquer cette requet?
    Par hayat2 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/05/2009, 07h57
  3. Pouvez vous m'expliquer ce code ?
    Par sayfouche dans le forum C#
    Réponses: 6
    Dernier message: 09/04/2008, 23h36
  4. Réponses: 1
    Dernier message: 01/10/2007, 17h32
  5. Serveur ftp pouvez vous m'expliquer svp
    Par fred59 dans le forum Dépannage et Assistance
    Réponses: 2
    Dernier message: 07/12/2006, 18h37

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