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 :

Entrée dans un programme (question de débutants)


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 7
    Par défaut Entrée dans un programme (question de débutants)
    Bonjour à tous,

    j'aimerais vous enquiquiner juste une dernière fois (après je vous promets je fais un break sur les questions bêtes),
    y a-t-il un moyen simple (donc accessible à mon niveau) de définir une entrée autre que le clavier dans un programme du style "compter les lignes" ?

    Je suppose qu'on doit modifier la valeur de getchar mais je n'arrive pas à trouver ça dans mon bouquin à mon niveau (K&R) alors qu'ils proposent de tester le programme sur lui-même...ce qui suppose de régler le fichier source comme entrée dans le programme ?

    Merci par avance

    Michael

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Oui, au lieu de fgets(..,stdin) c'est fgets(..,fichier), ou bien fscanf au lieu de scanf.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 7
    Par défaut
    donc par exemple :
    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
     
    #include <stdio.h>
    #define DEDANS 1
    #define DEHORS 0
    /*compte les lignes, les mots et les caractères en entrée */
     
    main()
    {
          int c, nl, nm, nc, etat;
          nl = nm = nc = 0 ;
           while ((c=getchar())!=EOF)
           {
                ++nc;
                if (c == '\n');
                ++nl     ;
                if (c == ' ' || c == '\n' || c == '\t')
                     etat = DEHORS;
                else if (etat == DEHORS)
                {
                     etat = DEDANS ;
                     ++nm;
     
                }
     
          }
          printf("%d\t %d\t %d\n", nl, nm, nc) ;
     
     
    }
    je dois mettre fgets("adresse du fichier à ouvrir comme entrée") à la place de quoi ?
    je dois le mettre dans la parenthèse de getchar ? ou alors échanger getchar pour fgets?

    Merci d'expliciter, je suis vraiment au tout début de mon apprentissage.

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Non, l'équivalent de getchar c'est fgetc
    Mais pour le faire sur un fichier, il faut l'ouvrir d'abord...

    Bah ouvre ton bouquin de C au chapitre des fichiers...

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Attention ton code est incorrect :

    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
    33
    34
    35
    #include <stdio.h>
    #define DEDANS 1
    #define DEHORS 0
    /*compte les lignes, les mots et les caractères en entrée */
    // attention au prototype de main, 
    // ici tu n'as pas besoin des arguments de la ligne de commande
    int main(void)
    {
          int c, nl, nm, nc, etat;
          nl = nm = nc = 0 ;
           while ((c=getchar())!=EOF)
           {
                ++nc;
     
                // ceci aurait-du être signalé par le compilateur
                // règle correctement les options
                if (c == '\n'); <== attention le test ici ne sert à rien a cause du ;
                   ++nl     ;
     
     
                if (c == ' ' || c == '\n' || c == '\t')
                     etat = DEHORS;
                else if (etat == DEHORS)
                {
                     etat = DEDANS ;
                     ++nm;
     
                }
     
          }
          printf("%d\t %d\t %d\n", nl, nm, nc) ;
     
         // main étant une fonction, elle doit retourner une valeur 
          return 0;
    }
    Il faut étudier correctement les options du compilo, les warnings signalés à la compile sont d'une grande aide pour la rédaction du programme

    Un code légèrement plus rapide peut-être celui-ci
    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
    33
    34
    #include <stdio.h>
    #define DEDANS 1
    #define DEHORS 0
    /*compte les lignes, les mots et les caractères en entrée */
     
    int main(void)
    {
          int c, nl, nm, nc, etat;
          nl = nm = nc = 0 ;
           while ((c=getchar())!=EOF)
           {
                ++nc;
    /*
                if (c == '\n');
                ++nl     ;
    */
                if (c == ' ' || c == '\n' || c == '\t')
                {
                     etat = DEHORS;
                     if (c == '\n')
                        ++nl;
                }
                else if (etat == DEHORS)
                {
                     etat = DEDANS ;
                     ++nm;
     
                }
     
          }
          printf("%d\t %d\t %d\n", nl, nm, nc) ;
     
          return 0;
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 7
    Par défaut
    Je vais étudier la question gruik, c'était pour faire l'exo, je me doute bien qu'en passant 20mn dans le bouquin pour trouver comment appliquer mon programme de 5 lignes à lui même je devrais y arriver, mais j'essaie de coller au bouquin (et donc à sa progression) parce que j'ai jamais programmé, et que si jem e perds dans le bouquin de K&R je vais y passer la nuit pour trouver ... ce qu'on pourrait m'expliquer en 5 mn
    Cela dit, le K&R est bien fait mais présume pas mal d'acquis, en particulier sur tous ce qui est fichier justement ... si ils te balancent à la 15ème page "appliquez votre programme à lui même" sans t'expliquer comment faire, t'es un peu perdu ...

    Merci pour la correction du code, il me faisait effectivement un warning mais je pigeais pas à quoi il faisait référence.
    C'était donc le ";" après la condition... ce qui rend tout ça plus clair dans ma tête.
    Cela dit, j'ai un warning "no newline at end of file" même avec ton code à la dernière ligne.... j'arrive pas à voir ce qui va pas...vous savez à quoi c'est dû ?

    Merci bien !

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    "no newline at end of file"
    signifie, je crois, "Pas de retour chariot à la fin du fichier".
    C'est un bug de Dev C++ je crois, fais un retour chariot sur la dernère ligne, c'est tout !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    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
    shhht! C'est pas un bug, c'est une feature! ©

    Enfin trève de plaisanterie, ce warning est utilisé pour signaler que la dernière ligne d'un fichier ne se termine pas par un caractère newline (\n).
    Résultat, si on concaténait deux fichiers (je crois qu'il y a des commandes shell simples qui peuvent le faire par exemple), la dernière ligne du premier fichier et la première ligne du second se retrouveraient sur la même ligne...
    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.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par michael-C
    y a-t-il un moyen simple (donc accessible à mon niveau) de définir une entrée autre que le clavier dans un programme du style "compter les lignes" ?
    Oui. Le livre de C de Kernighan & Ritchie n'est pas fait pour les débutants absolus en informatique.

    Il faut connaitre un peu son système et savoir faire une indirection entrante (ligne de commande) comme, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ monappli < monfichier
    K&R2 chapitre 7 (page 150)

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Trap D
    C'est un bug de Dev C++ je crois,
    Non. C'est une exigence du langage C. Une ligne de texte doit être terminée par un \n.

  11. #11
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C'est une exigence du langage C. Une ligne de texte doit être terminée par un \n.
    et non précédé de '\' pour la dernière:
    A source file that is not empty shall end in a new-line character,
    which shall not be immediately preceded by a backslash character before any such
    splicing takes place.
    draft 9899 chapitre 5.1.1.2 point 2

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/09/2007, 09h35
  2. Réponses: 9
    Dernier message: 06/06/2007, 15h40
  3. Supprimer une entrée dans ajout suppression des programmes
    Par lavazavio dans le forum Windows XP
    Réponses: 5
    Dernier message: 01/05/2007, 18h30
  4. [Débutant] Pause dans un programme en mode console ?
    Par pugnator dans le forum Langage
    Réponses: 2
    Dernier message: 15/12/2006, 12h08
  5. [Débutant] Listener pour une entrée dans le presse papier.
    Par Silvio02 dans le forum Général Java
    Réponses: 6
    Dernier message: 08/01/2006, 22h44

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