“Fprintf” funzione -come per descrittori di file (cioè int fd anziché FILE * fp)
Domanda
Forse sto solo manca, ma non c'è una funzione equivalente a fprintf per i descrittori di file, o anche un modo per temporaneamente flip-flop tra loro?
Soluzione
Si potrebbe guardare in dprintf
( estensioni GNU, non in C o POSIX ):
Le funzioni dprintf () e vdprintf () (Come si trova nella biblioteca glibc2) sono analoghi esatte di fprintf () e vfprintf (), tranne che output un descrittore di file fd invece che a un data stream.
Modifica Come sottolineato da molti di voi nei commenti, POSIX 2008 standardizzato queste funzioni.
Altri suggerimenti
Non v'è alcun C o POSIX (edit: prima del 2008) la funzione standard per fare printf
su un descrittore di file, ma è possibile un descrittore di file “aperto” come FILE *
con il fdopen(int desc, const char *mode)
POSIX-standard. Io non sono sicuro di come ben supportato indietro lanciando a utilizzare il descrittore direttamente è, ma credo che potrebbe funzionare se si svuota il buffer prima ...
Naturalmente si può solo implementare il proprio utilizzando qualcosa come vsprintf
, ma ovviamente poi deve prendere cura del buffering.
Per quel che vale, in quanto dprintf
non è una funzione POSIX, si potrebbe utilizzare la seguente se la portabilità è un problema:
#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;
}
Molto probabilmente desidererebbe controllare il valore di ritorno di write
, ma si ottiene l'idea generale. Ovviamente, questo non tampone come il FILE *
routine fanno; Ero alla ricerca di più per gli identificatori di formato e la capacità di costruire i dati dei personaggi che si dovrebbero scrivere al descrittore di file, piuttosto che preoccuparsi il buffering dei dati come è stato scritto.
No, non c'è come standard, ma i due fanno cose diverse. fprinft, come parte di stdio, fa le cose come buffer di legge e scrive, supporti ungetc ecc Utilizzando un fd bypassa tutto questo e chiama il sistema operativo direttamente.
Quindi, non sono intercambiabili. Flip flop tra di loro sarebbe rovinare il buffering stdio se non altro
È possibile aprire il descrittore di file come un file normale che può essere gestito da fprintf()
con fdopen .