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

POSIX C Discussion :

récupèrer stdin venant d'un pipe


Sujet :

POSIX C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut récupèrer stdin venant d'un pipe
    Salut,
    j'ai écrit un programme qui prend comme option le nom d'un fichier.
    Mais je voudrais faire en sorte que ce fichier puisse être fourni par le flux d'entrée standard de manière à pouvoir piper les programmes.

    Mais à vrai dire je ne sais pas trop comment m'y prendre pour teste que stdin vient bien de la sortie d'un programme et non pas de mon clavier?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char **argv){
     
    	char 	ch[1024];
    	while( fgets(ch, 1000, stdin) )
    	{
    	   	printf("%s\n", ch);
    	}	
     
    	return 0;
     
    }
    merci de vos conseils.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    ben ya rien à faire..

    Puisque tu as mis un fgets avec stdin c'est toto-matique


    si ton programme s'appelle toto, quand tu feras par exemple

    toto prendra automatiquement son input de la sortie de "cat fichier".

    Et de l'intérieur du programme il n'y a rien à faire pour tester. C'est l'avantage de stdin.

    Par contre, si vraiment tu veux vérifier, alors il faudrait de l'intérieur du programme ouvrir ton fichier et comparer les lignes.. Mais je ne crois pas que ce soit ça que tu veux....

  3. #3
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    En fait, voilà ce que je souhaitais faire :

    tester si l'option -d a été fournie
    si non regarder dans stdin si y'a quelque chose
    si non message d'erreur et exit

    peut être n'ai-je pas la bonne logique?

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    réfléchis calmement à ton pbe..

    Expose-le réellement, pas la solution que tu viens d'exposer, mais le problème..

  5. #5
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    mon problème, comme je disais dans mon premier post, c'est que je ne vois pas comment faire de test sur stdin pour être sûr qu'il ne s'agit pas du clavier mais bien de la sortie standard d'un autre programme "pipé".

    Voici plus en détails, ce que je fais et ce que je voudrais faire.
    je travaille sur deux petits outils qui peuvent être utilisés independamment ou les uns à la suite des autres en pipe.
    le premier génére des lignes de texte en sortie standard.
    le second traite ce texte. Ce dernier a une option -d si la sortie standard du premier a été redirigé vers un fichier. Si l'option -d n'est pas renseigné, les données sont censées venir par l'entrée standard (via un pipe). C'est là que je coinçe : si mon utilisateur ne renseigne pas -d et ne fait pas de pipe.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Sous POSIX: isatty(), ou fstat().
    Ces fonctions sont supportées par la C Run-Time Library (CRT) de Microsoft, donc elles marchent sous Windows (sous les noms _isatty() et _fstat()).
    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.

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par julien.63
    mon problème, comme je disais dans mon premier post, c'est que je ne vois pas comment faire de test sur stdin pour être sûr qu'il ne s'agit pas du clavier mais bien de la sortie standard d'un autre programme "pipé".

    Voici plus en détails, ce que je fais et ce que je voudrais faire.
    je travaille sur deux petits outils qui peuvent être utilisés independamment ou les uns à la suite des autres en pipe.
    le premier génére des lignes de texte en sortie standard.
    le second traite ce texte. Ce dernier a une option -d si la sortie standard du premier a été redirigé vers un fichier. Si l'option -d n'est pas renseigné, les données sont censées venir par l'entrée standard (via un pipe). C'est là que je coinçe : si mon utilisateur ne renseigne pas -d et ne fait pas de pipe.
    Je ne comprend pas :

    ton entrée du 2ième est TOUJOURS stdin.

    La seule chose que tu as à tester, c'est si tu as un fichier de commandes. Auquel cas tu ne poses pas de questions. Et l'entrée se fera toujours par stdin...

    D'autre part, ce pourquoi tu te "mords la queue", c'est que ça n'est pas standard de traiter comme ça...

    La manière standard sous *n*x est celle-ci :

    1. Par défaut, tu mets un file descriptor comme variable dans ton programme.
    2. Avant d'explorer les options, tu l'affectes à stdin. ça prendra un pipe, un "<", ou des entrées manuelles.
    3. Si dans les options tu as -f, l'entrée viendra d'un fichier dont le nom suit l'option, et dans ce cas-là tu affectes le file descriptor au fichier.



    mais stdin est STANDARD....

    et ça n'est pas juste pour le pipe.... comme je disais tu pourrais faire "mon prog < fichier_réponses" et pour stdin c'est pareil, comme "cat fichier_reponses | monprog" ...

    C'est pour ça que je te disais qu'il y avait un problème de conception...

    Note : et si il y a des questions à poser, les poser dans tous les cas de figure SAUF si l'option -f est présente...

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

Discussions similaires

  1. stdin et pipe
    Par knice dans le forum POSIX
    Réponses: 6
    Dernier message: 14/10/2008, 22h43
  2. Stdin/Pipes et intégration MPlayer à VB6
    Par Yop dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/10/2008, 14h27
  3. récupérer des données venant d'ailleurs
    Par tixlegeek dans le forum Apache
    Réponses: 4
    Dernier message: 14/05/2008, 13h17
  4. [BASH] récupérer stdin
    Par une maison en bois dans le forum Linux
    Réponses: 7
    Dernier message: 04/11/2007, 13h46
  5. pipe stdin stdout
    Par onaipadesmickey dans le forum Linux
    Réponses: 1
    Dernier message: 22/08/2007, 16h20

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