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 :

[c] texte en ligne de commande


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut [c] texte en ligne de commande
    bonjour,

    j un prog qui lit un text entrée en ligne de commande et calcul le nombre d'occurrence de plusieurs mots . la fin de mon texte est indiquée par ctr+D (EOF).

    exemple :

    XXX XX XXXX XX
    XXXXX XXX
    XXXX XX XX XXXXX XX ( ctr+D)

    le texte est une suite de mots séparé par un ou plusieurs espace (fin de ligne)

    je suis totalement perdu la, c'est la première fois que je travaille avec un cas similaire, j m suis habitué a manipulé des fichiers .txt mais la je trouve pas de solution a mon problème.

    et merci d'avance

  2. #2
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    bonjour,

    c'est quoi le problème ?
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  3. #3
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    comment j fais pour récupérer le texte et le parcourir aprés ??
    et comment j fais pour le ctrl+D indiquant la fin de mon fichier ???

  4. #4
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    Je pense que tu peux déjà commencer par lire la

    Tu trouveras surement ton bonheur
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 377
    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 377
    Points : 23 660
    Points
    23 660
    Par défaut
    +1 pour la FAQ.

    Ctrl-D correspond au code ASCII 04, qui lui même signifie « EOT : End Of Transmission ».

    Si tu travailles sous UNIX, c'est le Shell qui gère cela : le fait que l'utilisateur saisisse ce code provoque l'envoi immédiat de ce qu'il y a dans le tampon et s'il n'y a rien, envoie un bloc vide. Et recv() renvoie « 0 octet reçu » si l'homologue a fait un arrêt normal.

    Ce n'est donc pas du tout à ton programme de gérer Ctrl-D. À la place, vérifie si tu reçois EOF et surveille feof(), comme si ton entrée standard était un fichier ordinaire que tu aurais ouvert toi-même. Tous les cas de figure seront automatiquement pris en charge.

  6. #6
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    donc d'après ce que j compris j dois travailler en mode brut et de récupérer chaque ligne de mon texte a part, et pour définir la fin de mon texte je dois taper ctrl-D qui retournera le code ascii de ce dernier et pour finir je valide avec entrée ???

    mais la partie que je comprend pas c'est celle la:

    * Si on tente d'afficher '\n', le programme saute une ligne sans retourner au début de la ligne (il faut donc utiliser '\r' suivi de '\n' pour revenir en début de ligne puis aller à la ligne suivante).

    est ce qu'elle va gérer les retour a la ligne ??

    donc a chaque fois que je tape sur entrée il y'aura un saut de ligne ?? parce que en fin de compte c'est le but de mon algo il doit lire un texte de plusieurs ligne donc au moment de la saisie je besoin d'avoir un texte de la forme suivante en ligne de commande:

    XXX XX XXXXXX XX XXX
    XX XXXX XX XXXX
    XXX XXX

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 377
    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 377
    Points : 23 660
    Points
    23 660
    Par défaut
    Citation Envoyé par zOoOm_10 Voir le message
    donc d'après ce que j compris j dois travailler en mode brut et de récupérer chaque ligne de mon texte a part, et pour définir la fin de mon texte je dois taper ctrl-D qui retournera le code ascii de ce dernier et pour finir je valide avec entrée ???
    Non, justement pas. Relis bien.

    C'est le Shell qui va gérer l'appui sur Ctrl-D. Du côté de ton client, cela se traduira simplement par une fin de fichier, et il ne pourra pas savoir a priori si ce qu'il a reçu venait d'un fichier ou du clavier de l'utilisateur. Ce sera complètement transparent.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Non, justement pas. Relis bien.

    C'est le Shell qui va gérer l'appui sur Ctrl-D. Du côté de ton client, cela se traduira simplement par une fin de fichier, et il ne pourra pas savoir a priori si ce qu'il a reçu venait d'un fichier ou du clavier de l'utilisateur. Ce sera complètement transparent.
    j bien suivis le faq et voila ce qui me donne comme résultat aprés un CTRL+D

    il m'affiche ^D et le programme s'arrête !!!!!

    sinon deja pour le fichier j'arrive meme pas a écrire un fichier sur plusieurs ligne ... j'arrive pas a contournée l'entrer donc ce que j'arrive a faire jusqu'à maintenant c'est d'ecrire une seule ligne et la récupérer grâce a :

    fgets(chaine,taille,stdin)....

    est ce qu'il aurait pas une solution de récupérer un fichier directement , du style je déclare une variable

    File * fichier

    j récupère le fichier saisie au clavier et je parcours mon fichier???

    j bloque la dessus depuis 3 jours et je trouve rien

  9. #9
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    voici une partie du code que j fais sur un fichier :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int occurence ( char *s , char * mot){
     
    int n= 0,i;
     
    for( i=0;i<strlen(s)-strlen(mot);i++)
    {
    if (!memcmp(s+i,mot,strlen(mot)))
    {
    n++;
    i+=strlen(mot);
    }
     
    }
     
    return n;
    }
     
     
    int main(void)
    {
     
    FILE *fp=NULL;
      char name[100];
      char mot[100],s[512];
      int n=0;
      int nb=0;
     
     
      printf("mot \n ");
      gets(mot);
     
      if(!(fp=fopen("test.txt","r")))
      {
      exit (0) ;
      }
     
      while(fgets(s,512,fp))
      {
     
      n+=occurence(s,mot) ;
      }
     
      printf("resultat : %d " , n );
     
     
      fclose(fp);
     
     
        return 0;
    }
    Maintenant pour récupérer le fichier saisie sur console ca passe pas

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 377
    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 377
    Points : 23 660
    Points
    23 660
    Par défaut
    Pour commencer, tu travailles avec quel système d'exploitation ?

    Ensuite, le programme que tu as écrit fonctionne. Ok. Supprime l'ouverture et la fermeture du fichier, et dans ton fgets(), remplace fp par stdin, comme tu l'avais fait, et recompile.

    Maintenant, depuis la ligne de commande, saisis :

    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    $ ./tonprogramme < tonfichier

    Le résultat devrait être rigoureusement le même que lorsque tu ouvres ton fichier toi-même. Relance enfin ton programme sans la redirection de fichier :


    Et saisis tes infos en terminant par Ctrl-D. Qu'observes-tu ?

    Note importante : Pour simplifier, Ctrl-D provoque l'envoi de ce qu'il y a dans le buffer, et il faut envoyer un buffer vide pour simuler une fin de transmission normale. Ctrl-D doit donc être saisi sur une ligne vide. Ce qui donne, non pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    XXX XX XXXX XX
    XXXXX XXX
    XXXX XX XX XXXXX XX ( ctr+D)
    … mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    XXX XX XXXX XX
    XXXXX XXX
    XXXX XX XX XXXXX XX
    ( ctr+D)

  11. #11
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    j travaille sous linux ...

    mais c'est bon ca marche maintenant merci beaucoup

    seul problème c'est que sous linux au moment de la création d'objet il me sort un warning concernant le fgets .
    donc j fais une méthode qui me permet de vider le buffer afin d'éviter les traces du texte dans le buffer, mais j toujours le meme warning .

    est ce qu'il aurait un autre solution afin d'éviter ce problème ??
    PS: le warning s'affiche uniquement lors de la première instanciation d'objet

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 377
    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 377
    Points : 23 660
    Points
    23 660
    Par défaut
    Attention, je te vois parler de « méthode » et d'instanciation d'objet, etc. Les « fichiers objets » produits par le compilateur n'ont rien à voir avec la programmation orientée objet…

    Si tu as un warning à la compilation, c'est qu'il y a une erreur dans ton code, même si celui-ci reste valide syntaxiquement. Tu peux passer l'option « -Werror » pour forcer le compilateur à traiter tous les avertissements comme des erreurs.

    Montre-nous le message en question et l'éventuelle section de code concernée…

  13. #13
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Attention, je te vois parler de « méthode » et d'instanciation d'objet, etc. Les « fichiers objets » produits par le compilateur n'ont rien à voir avec la programmation orientée objet…

    Si tu as un warning à la compilation, c'est qu'il y a une erreur dans ton code, même si celui-ci reste valide syntaxiquement. Tu peux passer l'option « -Werror » pour forcer le compilateur à traiter tous les avertissements comme des erreurs.

    Montre-nous le message en question et l'éventuelle section de code concernée…
    oui t'a raison

    ca fait 3 ans que j pas programmer en c donc j suis en mode programmation objet .

    sinon juste apres le gcc prog -o prog

    il m'affiche

    the gets function is dangerous and should not be used

  14. #14
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 377
    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 377
    Points : 23 660
    Points
    23 660
    Par défaut
    Dans ce cas, ça concerne gets() et pas fgets().

    gets() est une fonction standard C depuis le début, mais elle a l'inconvénient historique de ne pas permettre au codeur de spécifier la taille du buffer qu'elle attend en argument. Et comme elle ne lit que l'entrée standard, la source des données n'est pas contrôlée non plus par le programme. Par conséquent, il n'y a rien qui puisse empêcher un utilisateur de faire un buffer overflow avec un programme écrit avec cette fonction (sauf à ouvrir manuellement un fichier, à refermer l'entrée standard et à remplacer son descripteur par celui du fichier, mais c'est vraiment tordu).

    gets() est donc officiellement dépréciée même si on ne peut la supprimer pour des raisons de compatibilité. Elle est en revanche absente des standards récents.

  15. #15
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    j résolu le problème merci Obsidian

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/11/2014, 00h08
  2. Comment compiler un projet en ligne de commande ?
    Par mathieutlse dans le forum EDI
    Réponses: 3
    Dernier message: 11/07/2003, 13h32
  3. Réponses: 3
    Dernier message: 07/04/2003, 20h06
  4. Récuperer Arguments sur la ligne de commande ?
    Par Muetdhiver dans le forum x86 16-bits
    Réponses: 9
    Dernier message: 20/01/2003, 21h01
  5. Analyser la ligne de commande
    Par benj29 dans le forum C
    Réponses: 14
    Dernier message: 19/11/2002, 04h13

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