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 :

"/O", même signification que EOF ?


Sujet :

C

  1. #21
    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
    Sous Windows, il me semble qu'on utilise Ctrl+Z au lieu de Ctrl+D.
    Sinon, certains programmes (comme le mail en ligne de commande des systèmes *n*x) acceptent aussi une ligne contenant seulement un point comme signal de fin, mais ça c'est un comportement spécifiquement écrit dans le programme.

    Sinon, la plupart des "fins d'entrée standard" arrivent quand un fichier texte (ou la sortie d'un autre programme) a été redirigé sur l'entrée standard.
    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.

  2. #22
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Learner_ Voir le message
    Un petit truc, est-ce qu'il existe un autre moyen de signifier à la machine que c'est la fin de la "transmission" ou bien du message rentré par l'utilisateur ? (simple question de curiosité )

    Merci !
    Pourquoi faire ??? Quand un truc marche, pourquoi en écrire un second qui démultipliera les traitements et les risques associés ???
    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]

  3. #23
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Sous Windows, il me semble qu'on utilise Ctrl+Z au lieu de Ctrl+D.
    Sinon, certains programmes (comme le mail en ligne de commande des systèmes *n*x) acceptent aussi une ligne contenant seulement un point comme signal de fin, mais ça c'est un comportement spécifiquement écrit dans le programme.

    Sinon, la plupart des "fins d'entrée standard" arrivent quand un fichier texte (ou la sortie d'un autre programme) a été redirigé sur l'entrée standard.
    Merci pour ces précisions Médinoc ! ^^

    Citation Envoyé par Sve@r Voir le message
    Pourquoi faire ??? Quand un truc marche, pourquoi en écrire un second qui démultipliera les traitements et les risques associés ???
    Simplement parce que le fait d'appuyer sur Ctrl-D pour finir l'exécution de mon programme ne me paraît pas la plus... commune Mais je vais m'en tenir à cette version Merci Sve@r !

  4. #24
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Re-hello !

    Je me suis rendue compte que mon programme compte bizarrement... J'ai pourtant bien initialisé toutes mes variables... Je soupçonne la double boucle while d'être à l'origine de mes soucis.... Mais je ne suis pas sûre ...
    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
    26
    27
    28
    29
    30
    31
    32
     
    #include <Stdio.h>
    main()
    {
      printf("%s \n", "Entrez un message n'ayant pas plus que 50 caractères:");
            char entree[51];
            int i = 0;
            fgets(entree, sizeof(entree), stdin);
            long nombre_espace = 0;
            long nombre_tab = 0;
            long nombre_fin_ligne = 0;
            char courant;
            while (fgets(entree, sizeof(entree), stdin) != NULL)
            {
                    while ((courant = entree[i]) != '\0')
                    {
                            if (courant == ' ')
                            {       
                                    nombre_espace++;
                            }
                            if (courant == '\t')
                            {
                                    nombre_tab++;
                            }
                            if (courant == '\n')
                            {
                                    nombre_fin_ligne++;
                            }
                    i++;
                    }
            printf("%s %ld \n %s %ld \n %s %ld \n", "Nombre d'espaces : ", nombre_espace, "Nombre de tabulations :", nombre_tab, "Nombre de fin de lignes : ", nombre_fin_ligne);
    }
    Merci d'avance !

    PS : d'ailleurs, concernant les deux boucles while, peut on les expliquer simplement comme : la première contrôle si on n'a pas encore indiqué le EOT, tandis que la deuxième s'occupe de traiter le tableau de char contenant les différentes lignes ? (petite demande de confirmation)

  5. #25
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    1- Pourquoi y a t-il deux fgets() ?

    2-i doit être remis à 0 dans la boucle while (fgets(entree, sizeof(entree), stdin) != NULL) et avant la boucle while ((courant = entree[i]) != '\0') .

    3- Selon ce que tu veux obtenir, nombre_espace et nombre_tab peut être également
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #26
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par diogene Voir le message
    1- Pourquoi y a t-il deux fgets() ?
    heu... parce que j'avais plusieurs lignes à lire ^^" Je n'ai besoin que de de le mettre une fois pour lire plus d'une ligne ?

    Citation Envoyé par diogene Voir le message
    2-i doit être remis à 0 dans la boucle while (fgets(entree, sizeof(entree), stdin) != NULL) et avant la boucle while ((courant = entree[i]) != '\0') .
    Pourquoi ?
    Citation Envoyé par diogene Voir le message
    3- Selon ce que tu veux obtenir, nombre_espace et nombre_tab peut être également
    heu, puisque je veux compter le nombre d'espaces et de tabulations dans l'intégralité de ce que l'utilisateur rentre, je ne dois pas le remettre à 0 ... (enfin, je crois )

  7. #27
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    1- Celui dans le while() suffit.

    2- Parce que à chaque tour de boucle, tu remplis le tampon (à partir du début et pas à la suite de ce qu'il y avait) par une nouvelle ligne et qu'il faut l'analyser à partir du début

    3- Alors c'est bon. C'est pourquoi j'avais écrit
    Selon ce que tu veux obtenir, nombre_espace et nombre_tab peut être également
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  8. #28
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par diogene Voir le message
    1- Celui dans le while() suffit.

    2- Parce que à chaque tour de boucle, tu remplis le tampon (à partir du début et pas à la suite de ce qu'il y avait) par une nouvelle ligne et qu'il faut l'analyser à partir du début
    Donc si j'ai bien compris,
    - fgets() lit une ligne de texte en conservant ce qu'elle a lu dans un buffer/tampon vrai ?
    - pour lire une autre ligne, on appelle simplement de nouveau fgets() ?

    Citation Envoyé par diogene Voir le message
    3- Alors c'est bon. C'est pourquoi j'avais écrit "Selon ce que tu veux obtenir, nombre_espace et nombre_tab peut être également"
    D'accord, j'avais juste besoin d'une confirmation

    Merci beaucoup en tout cas ^^

  9. #29
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Si j'ai fgets(entree, sizeof(entree), stdin); et que je tape abc<return> alors entree contiendra {'a', 'b', 'c', '\n', '\0' }. Si je tape ensuite xy<return> alors le contenu de entree sera {'x', 'y', '\n', '\0' } qui remplacera l'ancien contenu de entre.
    - pour lire une autre ligne, on appelle simplement de nouveau fgets() ?
    Oui (si la ligne précédente a été entièrement lue, autrement dit il y avait un '\n' dans entree, sinon on continue sur la même ligne).
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #30
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Learner_ Voir le message
    Donc si j'ai bien compris,
    - fgets() lit une ligne de texte en conservant ce qu'elle a lu dans un buffer/tampon vrai ?
    - pour lire une autre ligne, on appelle simplement de nouveau fgets() ?
    En fait, le concept même de ligne n'est qu'une illusion.
    Un fichier texte contient du texte intercalé avec des caractères '\n'. Lorsque tu ouvres ce fichier dans un éditeur, il reconnait ce '\n' et l'utilise pour t'afficher les différents textes situés de pars et d'autre de ce caractère sur des lignes distinctes. D'où le fait que ce fichier soit visualisé sous formes de lignes à l'écran.
    fgets() se comporte de la même façon. Il lit le texte et s'arrête
    • quand il rencontre un caractère '\n'
    • quand le nombre d'octets demandé a été atteint (en réalité il en lit un de moins que demandé car il garde le dernier pour y mettre le '\0')

    Donc si ta ligne à lire est plus grande que le nombre d'octets prévu, ta ligne récupérée peut très bien être incomplète et le reste sera récupéré au fgets suivant. Pour de petits codes c'est pas vraiment grave (on compte sur la chance) mais pour des codes plus robustes il faut s'en préoccuper.

    Accessoirement il existe une librairie libreadline qui t'offre une fonction readline() qui, elle, ne se préoccupe pas de la taille de la ligne. Tant que la ligne n'est pas terminée, readline() continue à la récupérer jusqu'au '\n'. Cette librairie est installée généralement en standard sous Linux...
    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]

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