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?

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top