« Fprintf » fonction -comme pour les descripteurs de fichiers (par exemple int fd au lieu de FILE * fp)

StackOverflow https://stackoverflow.com/questions/4246588

  •  27-09-2019
  •  | 
  •  

Question

Peut-être que je manque juste, mais n'est pas là une fonction équivalente à fprintf pour les descripteurs de fichiers, ou même un moyen de bascule temporairement entre eux?

Était-ce utile?

La solution

Vous pourriez regarder dans dprintf ( extensions GNU, non en C ou Posix ):

  

Les fonctions dprintf () et vdprintf ()   (Que l'on trouve dans la bibliothèque glibc2) sont   analogues exacts de fprintf () et   vfprintf (), sauf qu'ils sortie   un descripteur de fichier fd au lieu de un   flux donné.

EDIT Comme l'a fait par plusieurs d'entre vous dans les commentaires, 2008 Posix normalisé ces fonctions.

Autres conseils

Il n'y a pas C ou POSIX (edit: avant 2008) fonction standard pour faire printf sur un descripteur de fichier, mais vous pouvez « ouvrir » un descripteur de fichier en tant que FILE * avec le standard fdopen(int desc, const char *mode) POSIX. Je ne sais pas comment revenir flipping bien soutenu à l'aide du descripteur est directement, mais je devine qu'il pourrait fonctionner si vous vider la mémoire tampon premier ...

Bien sûr, vous pouvez simplement mettre en œuvre votre propre en utilisant quelque chose comme vsprintf, mais il est évident que vous devrez alors prendre soin de la mise en mémoire tampon.

Pour ce que ça vaut, puisque dprintf n'est pas une fonction POSIX, on pourrait utiliser les éléments suivants si la portabilité est un problème:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>

int
fdprintf ( int fd, size_t bufmax, const char * fmt, ... )
{
  char * buffer;
  int n;
  va_list ap;

  buffer = ( char * ) malloc ( bufmax );
  if ( !buffer )
    return 0;

  va_start ( ap, fmt );
  n = vsnprintf ( buffer, bufmax, fmt, ap );
  va_end ( ap );

  write ( fd, buffer, n );
  free ( buffer );
  return n;
}

La plupart serait probablement vouloir vérifier la valeur de retour de write, mais vous avez l'idée générale. De toute évidence, cela ne cache pas comme les routines FILE * faire; Je cherchais plus pour le format et la capacité spécificateurs de construire les données de caractère qui seraient écrits dans le descripteur de fichier, plutôt que de se soucier de mise en mémoire tampon des données comme il est écrit.

Non, il n'y a pas standard, mais les deux font des choses différentes. fprinft, dans le cadre de stdio, fait des choses comme tampon lit et écrit, supports ungetc etc. L'utilisation d'un fd court-circuite tout cela et appelle directement le système d'exploitation.

Alors, ils ne sont pas interchangeables. Flip flop entre eux se bousiller tampon stdio si rien d'autre

Vous pouvez ouvrir le descripteur de fichier comme un fichier normal qui peut être manipulé par fprintf() avec fdopen .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top