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 :

Rediriger la sortie standard du printf


Sujet :

C

  1. #1
    Membre éclairé
    Avatar de yvesall
    Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 208
    Par défaut Rediriger la sortie standard du printf
    voila c'est tout bete mais je m en sort pas, je veux faire une sorte de strdup+printf (la fonction existe deja mais ne passe pas sur toute les archi)

    donc je fais simplement un 1ere printf pour reccuperer la taille de ma chaine de char
    puis un malloc
    puis un sprintf

    mais le souci est que le 1er printf affiche sur la sortie standard
    ce qui est indesirable (le but de ma fonction etant de copier la chaine de char dans un char * et non pas de faire de l'affichage)

    donc comment puis je rediriger la sortie standard de ma fonction pour qu'elle ne soit pas visible a l'ecran (de preference vers /dev/null ou tout autre methode compatible multi archi)

    un bout de code pour aider :

    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
    void	*dprintf(const char *format, ...)
    {
      va_list	va;
      char		*tmp;
      int		len;
     
      va_start(va, format);
      len = vprintf(format, va);  // inhiber celui la
      if (!(tmp = malloc(sizeof(*tmp) * (len + 1))))
        {
          printf("Malloc : [FAILED]\n");
          return (0);
        }
      vsprintf(tmp, format, va);
      va_end(va);
      return (tmp);
    }
    merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    fopen("/dev/null");
    fprintf();
    fclose();

    Sous Windows, tu peux faire la même chose avec NUL au lieu de /dev/null, ou bien tu peux directement utiliser la fonction _scprintf() à la place.

    Ce qui donnerait:
    Code C : 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
    56
    57
    58
    59
    60
    #ifndef WIN32 /* Ou un autre truc genre #ifdef XOPEN_SOURCE */
     
    int _vscprintf(const char *format, va_list args)
    {
    	int ret = -1;
    	FILE * pf = fopen("/dev/null");
    	if(pf != NULL)
    	{
    		ret = vfprintf(pf, format, args);
    		fclose(pf), pf=NULL;
    	}
    	return ret;
    }
     
    int _scprintf(const char *format, ...)
    {
    	int ret = -1;
    	va_list args;
    	va_start(args, format);
    	ret = _vscprintf(format, args);
    	va_end(args);
    	return ret;
    }
     
    #endif
     
    /* Pourquoi retournais-tu un void* ? */
    char * vdprintf(const char *format, va_list args)
    {
    	char * ret = NULL;
    	int len = _vscprintf(format, va);
    	if(len < 0)
    	{
    		fprintf(stderr, "_vscprintf : [FAILED]\n");
    	}
    	else
    	{
    		char * tmp = malloc(sizeof(*tmp) * (len + 1));
    		if(tmp == NULL)
    		{
    			fprintf(stderr, "Malloc : [FAILED]\n");
    		}
    		else
    		{
    			vsprintf(tmp, format, va);
    			ret = tmp;
    		}
    	}
    	return ret;
    }
     
    char * dprintf(const char *format, ...)
    {
    	char * ret = NULL;
    	va_list args;
    	va_start(args, format);
    	ret = vdprintf(format, args);
    	va_end(args);
    	return ret;
    }
    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.

  3. #3
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    ou bien, tu peut changer le "stdout" vers le descripteur de fichier que tu le veut ..........

  4. #4
    Membre éclairé
    Avatar de yvesall
    Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 208
    Par défaut
    et bien merci
    en effet ca fonctionne bien ^^
    je sent que je vais gagner du temps

    merci encore

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

Discussions similaires

  1. Rediriger la sortie standard/erreur vers une chaîne
    Par LaVaZza dans le forum Débuter
    Réponses: 2
    Dernier message: 11/07/2009, 16h58
  2. rediriger la sortie standard d'eclipse dans un fichier
    Par christianf dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 25/10/2007, 16h29
  3. Rediriger une sortie standard vers le presse-papier du bureau
    Par Schmorgluck dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 13/04/2007, 23h15
  4. Réponses: 2
    Dernier message: 22/05/2006, 11h02
  5. rediriger la sortie standard vers un textarea
    Par gromite dans le forum Composants
    Réponses: 9
    Dernier message: 10/05/2004, 11h07

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