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 :

Probleme de EOF


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Australie

    Informations professionnelles :
    Activité : Amateur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Par défaut Probleme de EOF
    Bonjour, je suis actuellement en train d’apprendre le langage C en utilisant le livre Language C (K&R).

    Je bloque déjà sur un problème certainement assez simple :

    Je cherche à afficher le nombre de caractère d’entré en sortie en utilisant une simple incrémentation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    int main()
       {
            printf("Please enter a sentence:");
           long nc;
           nc=0;
           while(getchar()!=EOF)
            ++nc;
           printf("number of character: %ld\n",nc);
        }
    Malheureusement, ce code ne marche pas. Je pense que le problème vient de EOF qui me sort de la boucle. En faisant des recherches, J’ai trouvé un autre code qui fonctionne très bien :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void){
     
        printf("Please enter a sentence:");
        fflush(stdout);
        char c;
        int nc=0;
        c=getchar();
       while (c !='\n') {
           nc++;
              c=getchar();
              }
              printf("number of character: %d\n",nc);
    return EXIT_SUCCESS;
    Sur ce programme la condition sur la boucle est ‘\n’ au lieux de EOF. J’ai donc essayer de remplacer cette condition dans le premier programme et vice versa ce qui résolve mon problème.

    Quelqu’un serait-il en mesure de m’expliquer pourquoi la condition de EOF ne marche pas dans ces programmes ?

    Dans le livre de K&R ils utilisent EOF donc cela doit marcher =).

    Merci pour votre aide.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    Quel est ton symptome?
    Que signifie conctrement ton "ca ne marche pas"?

    Sais-tu que sous linux, tu peux faire CTRL+D pour provoquer une fin de fichier?
    Dans mon souvenir, l'équivalent pour windows devrait être CTRL+Z.

    EOF n'est pas la fin d'une ligne, mais la fin du flux, ou pour être parfaitement littéral, la "fin du fichier" (end of file).
    Appuyer sur la touche <entrée> ne provoque pas une telle fin de fichier.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Australie

    Informations professionnelles :
    Activité : Amateur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Par défaut
    Bonjour,
    Que signifie conctrement ton "ca ne marche pas"?
    Lorsque je tape entrée en executant le programme avec une phrase rien ne s'affiche.

    Il semble que lorsque j'utilise EOF dans ma boucle le printf ne s'affiche pas car en bidouillant j'ai pu verifier que l'incrementation marchait correctement.

    Pourquoi le printf s'affiche en remplacant EOF par '\n' je ne comprends pas.

    Merci

  4. #4
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Australie

    Informations professionnelles :
    Activité : Amateur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Par défaut
    Je comprends bien que EOF c'est la fin de fichier.

    Ce que je ne comprends pas c'est qu'il m'affiche le printf si je limite ma boucle quand il rencontre une fin de ligne ('\n') mais pas si je lui limite la boucle avec la fin de fichier (EOF).

    Est-ce que la lecture du EOF a l'intérieur de la boucle déclenche automatiquement la fin de l'exécution? (cela me semblerai surprenant vu que je test la boucle sur une valeur différente de EOF)


    Dans ce cas-là, comment je px afficher mon résultat sur le nombre de caractère nc?

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    Quand tu demande la fin de fichier, il compte tant qu'il n'y a pas de fin de fichier.

    Dans la console, il n'y en a que lorsque tu fais une manipulation précise.

    Essaye ton programme avec une redirection d'un fichier existant:
    programme < fichier.txt

  6. #6
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    on pourrait aussi citer le fameux heredocument assez explicite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ wc -c <<EOF
    > 123
    > 456
    > 789
    > EOF
    12

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par brunounours1 Voir le message
    Ce que je ne comprends pas c'est qu'il m'affiche le printf si je limite ma boucle quand il rencontre une fin de ligne ('\n') mais pas si je lui limite la boucle avec la fin de fichier (EOF).
    Parce que le caractère '\n' permet de vider le tampon d'écriture Cela dépend de pleins de paramètres, mais en théorie c'est un des moyens de le faire (fflush)

    ISO C99 section 7.19.3/3:
    When a stream is unbuffered, characters are intended to appear from the source or at the destination as soon as possible. Otherwise characters may be accumulated and transmitted to or from the host environment as a block.

    When a stream is fully buffered, characters are intended to be transmitted to or from the host environment as a block when a buffer is filled.

    When a stream is line buffered, characters are intended to be transmitted to or from the host environment as a block when a new-line character is encountered.

    Furthermore, characters are intended to be transmitted as a block to the host environment when a buffer is filled, when input is requested on an unbuffered stream, or when input is requested on a line buffered stream that requires the transmission of characters from the host environment.

    Support for these characteristics is implementation-defined, and may be affected via the setbuf and setvbuf functions.
    Et en théorie, à la fin de ton programme tout doit être écrit dans ta fenêtre

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par brunounours1 Voir le message
    Je comprends bien que EOF c'est la fin de fichier.
    Bonjour
    EOF ce n'est pas la fin de fichier. Prends n'importe quel ficher texte, tu verras qu'il se termine d'une façon ou d'une autre mais jamais par EOF.

    EOF c'est une valeur spéciale (qui vaut pour l'instant -1) que renvoie la fonction de lecture quand elle ne peut plus lire le fichier parce qu'elle a atteint sa fin. Ce n'est pas la même chose.

    Et pour info, ton premier code fonctionne parfaitement...
    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 à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Australie

    Informations professionnelles :
    Activité : Amateur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Par défaut
    Merci pour vos reponses, je potasse tout cela et je reviens vers vous car comme je le disais au debut, je debute sur le language C et ce n'est pas facile ;-)

Discussions similaires

  1. [AC-2003] Probleme avec Do Until rst.EOF
    Par kesamba dans le forum IHM
    Réponses: 6
    Dernier message: 22/01/2013, 21h56
  2. probleme d EOF
    Par youness_ka dans le forum ASP.NET
    Réponses: 1
    Dernier message: 10/08/2007, 13h23
  3. débutant; problem avec EOF
    Par pitbul100 dans le forum Débuter
    Réponses: 10
    Dernier message: 22/05/2006, 18h39
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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