Vous pouvez utiliser sprintf
ou snprintf
pour imprimer dans un tampon char *
, puis utiliser write
. Pour obtenir un descripteur de fichier à partir d'une variable FILE *
, vous pouvez utiliser fileno
. Il n'y a pas de manière portable de passer d'un descripteur de fichier à un FILE *
, cependant: vous pouvez utiliser de façon portative fdopen
à associer un à un FILE *
avec un descripteur de fichier valide.
En outre, la dernière norme POSIX spécifie dprintf
, mais la GNU libc dprintf
page man a ceci à dire:
Ces fonctions sont des extensions GNU, non en C ou POSIX. Clairement, les noms ont été mal choisis. De nombreux systèmes (comme MacOS) ont incompatibles les fonctions appelées dprintf()
, généralement une version de débogage de printf()
, peut-être avec un prototype comme
void dprintf (int level, const char *format, ...);
où le premier paramètre est un niveau de débogage (et la sortie est à stderr
). En outre, dprintf()
(ou DPRINTF
) est également un nom de macro populaire pour un débogage printf
. Donc, probablement, il est préférable d'éviter cette fonction dans les programmes destinés à être portables.
Bien sûr, la page de manuel libc est pas mis à jour avec la dernière norme à l'esprit, mais vous devez toujours être prudent avec l'utilisation dprintf
, puisque vous pourriez obtenir quelque chose que vous ne voulez pas. :-)
Problème avec 'snprintf' (je prétends que vous n'avez pas mentionné' sprintf') c'est qu'il est difficile de déterminer la taille du tampon sans que chaque 'my_printf' fasse potentiellement un' malloc 'et' free'. A moins que vous ne sachiez mieux que 1) essayez 'snprintf' avec un tampon de taille arbitraire sur la pile, 2) si' snprintf' renvoie un nombre plus petit que le buffer, alors 'write' le buffer et retournez, sinon 3)' malloc' un tampon au moins de cette taille, 'snprintf' dedans,' write', puis 'free' et retour. –
@Mike: 'snprintf()' avec le tampon 'NULL' et la taille 0 vous donne la taille requise en C99. Mais cela signifie que 'snprintf' est appelé deux fois pour chaque tampon. J'aime beaucoup dprintf, mais il se peut qu'il ne soit pas disponible. 'fdopen' est sympa, mais je suis à peu près sûr qu'il faut créer deux 'FICHIER *' si on veut lire et écrire en utilisant cette approche. Merci pour votre commentaire! –
Il est intéressant qu'ils disent que MacOS a un 'dprintf 'incompatible, parce que' man dprintf' sur ma boîte Mac OS X 10.6 donne 'Aucune entrée manuelle pour dprintf'. Je n'avais jamais entendu parler de 'dprintf' avant, de toute façon. –