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 :

Incompréhension EOF ET NULL


Sujet :

C

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut Incompréhension EOF ET NULL
    Bonsoir a tous

    Pourquoi la boucle s'arrête quand fgetc renvoie EOF et quand fgets renvoie NULL ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    do
            {
                caractereActuel = fgetc(fichier); // On lit le caractère
                printf("%c", caractereActuel); // On l'affiche
            } while (caractereActuel != EOF);
    La fonction fgets() va lire une ligne jusqu'à rencontrer \n et en mettant != NULL cela sera un boucle infini ? Non? ... car le pointeur retourné par fgets est toujours (!= NULL)

    En fin je suis perdu là..

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Bonsoir,

    Citation Envoyé par lassault1 Voir le message
    Pourquoi la boucle s'arrête quand fgetc renvoie EOF et quand fgets renvoie NULL ?
    Quelle boucle ?

    La fonction fgets() va lire une ligne jusqu'à rencontrer \n et en mettant != NULL cela sera un boucle infini ? Non? ... car le pointeur retourné par fgets est toujours (!= NULL)
    Non :

    Citation Envoyé par man page
    gets() and fgets() return s on success, and NULL on error or when end of file occurs while no characters have been read.

    Ce qui veut dire ce que cela veut dire : fgets() renvoie NULL soit en cas d'erreur, soit si on se trouve déjà à la fin du fichier lu (plus précisément : si l'on atteint la fin de fichier alors qu'aucun caractère n'a encore été lu).

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    j'ai édité.. et toujours pas compris..

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Il s'agit de deux fonctions différentes :

    • fgetc() lit un caractère depuis un flux donné et te le renvoie en tant que valeur de retour. Comme il se peut qu'il se produise une erreur, telle qu'une fin de fichier, alors fgetc() te renvoie un int plutôt qu'un char, dont la valeur est celle du caractère si tout va bien, ou « EOF » dans le cas contraire (EOF valant généralement -1) ;
    • fgets() va lire une chaîne de caractères. Elle va donc elle-même faire la boucle que tu fais faire à fgetc(). Il n'y a donc pas lieu de mettre cette fonction dans une boucle while() sauf si tu veux lire plusieurs chaînes, successivement. D'autre part : contrairement à fgetc() qui te renvoie le caractère lu, fgets() dépose directement la chaîne dans un buffer que tu lui as précisé à l'avance. La valeur de retour de fgets() ne sert donc a priori qu'à savoir si tout s'est bien passé.

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

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

    Je crois que pour vraiment comprendre je dois savoir ça :

    1/ Est ce que le fonction fgets renvoie un pointeur juste pour vérifier si la lecture a bien été faite et aussi pour nous permettre de faire des boucles en faisant while fgets(...) != NULL ?

    2/ Si la fonction fgets ne renvoyait pas de pointeur (chaine) est-ce qu'on aurait pu lire la chaine dans le printf ou est-ce qu'il faut qu'il nous renvoie la chaine pour pouvoir la lire?

    3/ Avez vous les fonctions fgets et fgetc pour voir leur fonctionnement?

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Toutes ces questions trouvent déjà leur réponse dans les posts ci-dessus. Il faut que tu les lises.

    Citation Envoyé par lassault1 Voir le message
    1/ Est ce que le fonction fgets renvoie un pointeur juste pour vérifier si la lecture a bien été faite et aussi pour nous permettre de faire des boucles en faisant while fgets(...) != NULL ?
    fgets() te renvoie l'argument que tu lui as passé. Ça veut dire que, si tout s'est bien passé, tu connais déjà l'endroit où se trouve la chaîne puisque c'est toi qui l'a spécifié.

    Tu peux effectivement faire while(fgets()) dans certains cas mais ce n'est pas une obligation. Une telle déclaration te permet de lire toutes les chaînes disponibles, une par une.

    2/ Si la fonction fgets ne renvoyait pas de pointeur (chaine) est-ce qu'on aurait pu lire la chaine dans le printf ou est-ce qu'il faut qu'il nous renvoie la chaine pour pouvoir la lire?
    La fonction fgets() dépose ce qu'elle lit à l'endroit où tu lui as dit de le faire. C'est donc cet endroit qu'il faut explorer avec printf().

    3/ Avez vous les fonctions fgets et fgetc pour voir leur fonctionnement?
    Tu peux essayer de retrouver les sources GNU mais je crains que ce soit un peu prématuré. Cela risque de te perdre encore plus au lieu de faire y voir plus clair.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    1/ Est ce que le fonction fgets renvoie un pointeur juste pour vérifier si la lecture a bien été faite et aussi pour nous permettre de faire des boucles en faisant while fgets(...) != NULL ?
    Le fait que la fonction retourne un pointeur (soit NULL en cas d'erreur ou de fin de fichier, ou le pointeur s en cas de succès) permet de l'intégrer directement dans la condition d'une boucle, ça simplifie les choses. Après, je ne sais pas ce qui a motivé ce système (retour d'un pointeur) au lieu d'un autre (on aurait pu retourner la valeur en modifiant une pointeur passé en argument par exemple). Qu'un système ou un autre soit utilisé ne change de toute façon pas grand-chose à l'affaire, il suffit simplement de lire la doc et de coder en accord avec cette doc.

    2/ Si la fonction fgets ne renvoyait pas de pointeur (chaine) est-ce qu'on aurait pu lire la chaine dans le printf ou est-ce qu'il faut qu'il nous renvoie la chaine pour pouvoir la lire?
    Concernant printf (et variantes) :
    Ces fonctions renvoient le nombre de caractères imprimés, sans compter le caractère nul `\0' final dans les chaînes.
    printf n'est pas censé savoir si le fgets qui précède a échoué ou pas. Il se contente d'afficher ce qu'on lui demande d'afficher. Ou alors je n'ai pas compris ta question.

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    Désolé Obsidian tu répond pas exactement a mes questions..

    Je tiens a préciser que je suis un gros débutant ayant pas encore 17 ans et j'aimerais avoir les réponses exacte a mes questions...

    Merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par lassault1 Voir le message
    1/ Est ce que le fonction fgets renvoie un pointeur juste pour vérifier si la lecture a bien été faite et aussi pour nous permettre de faire des boucles en faisant while fgets(...) != NULL ?
    Je pense que oui. Je ne l'utilise jamais autrement.

    Si la fonction fgets ne renvoyait pas de pointeur (chaine) est-ce qu'on aurait pu lire la chaine dans le printf ou est-ce qu'il faut qu'il nous renvoie la chaine pour pouvoir la lire?
    On aurait pu lire la chaîne même si fgets() retournait un int. Par contre, si fgets() ne retournait rien du tout, on n'aurait pas pu savoir s'il y avait eu une erreur.

    3/ Avez vous les fonctions fgets et fgetc pour voir leur fonctionnement?
    J'ai à portée de main le code de la version Microsoft, mais il serait mieux d'avoir une version qui repose directement sur les appels systèmes POSIX, plutôt que sur les fonctions de l'API Windows.
    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 du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    Merci Médinoc ainsi que les autres..

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/04/2014, 15h14
  2. Java null pointer incompréhensible
    Par vangoeth dans le forum Android
    Réponses: 2
    Dernier message: 15/01/2013, 20h07
  3. Problème EOF incompréhensible
    Par Sparco dans le forum Général Python
    Réponses: 5
    Dernier message: 09/08/2007, 08h53
  4. [VB6] [BDD] Recordset et champ égal à Null
    Par Gr|ppen dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/03/2003, 10h00
  5. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 00h07

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