« Fprintf » fonction -comme pour les descripteurs de fichiers (par exemple int fd au lieu de FILE * fp)
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?
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 .