„Fprintf“ -ähnlichen Funktion für Datei-Deskriptoren (d.h. int fd anstelle von FILE * fp)

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

  •  27-09-2019
  •  | 
  •  

Frage

Vielleicht bin ich nur fehlt es, aber es ist nicht eine Funktion äquivalent zu fprintf für Dateideskriptoren oder sogar eine Möglichkeit, vorübergehend Flip-Flop zwischen ihnen?

War es hilfreich?

Lösung

Sie können schauen Sie in dprintf ( GNU-Erweiterungen, nicht in C oder POSIX ):

  

Die Funktionen dprintf () und vdprintf ()   (Wie in der Bibliothek gefunden glibc2) sind   genauer Analoga von fprintf () und   vfprintf (), mit der Ausnahme, dass sie ausgegeben   ein Dateideskriptor fd statt auf ein   gegebener Strom.

Bearbeiten Wie bereits durch mehr von euch in den Kommentaren, 2008 POSIX diese Funktionen standardisiert.

Andere Tipps

Es gibt keine C oder POSIX (edit: vor 2008) Standardfunktion printf auf einem Dateideskriptor zu tun, aber man kann „offen“ ein Dateideskriptor als FILE * mit der POSIX-Standard fdopen(int desc, const char *mode). Ich bin sicher nicht, wie gut Flipping zurück unterstützte den Descriptor direkt zu verwenden ist, aber ich vermute, es könnte funktionieren, wenn Sie den Puffer spülen erste ...

Natürlich können Sie nur Ihre eigenen mit so etwas wie vsprintf implementieren, aber offensichtlich dann haben Sie die Pufferung kümmern.

Für das, was es wert ist, da dprintf keine Funktion POSIX ist, könnte man folgende verwenden, wenn Portabilität ist ein Thema:

#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;
}

Wahrscheinlich wollen Sie den Rückgabewert von write zu überprüfen, aber Sie bekommen die allgemeine Idee. Offensichtlich ist dieser Puffer nicht wie die FILE * Routinen zu tun; Ich war mehr für die Formatbezeich suchen und die Fähigkeit, die Zeichendaten zu erstellen, die auf den Dateideskriptor geschrieben werden würde, anstatt sich Gedanken über die Daten zu puffern, wie es geschrieben wird.

Nein, ist es nicht als Standard, aber die beiden verschiedene Dinge tun. fprinft, als Teil von stdio, tut Dinge wie Puffer liest und schreibt, unterstützt ungetc usw. ein fd umgeht all das und ruft das Betriebssystem direkt.

So sind sie nicht austauschbar. Flip Flop zwischen ihnen würde vermasseln stdio Pufferung, wenn nichts anderes

können Sie öffnen den Dateideskriptor als eine normale Datei, die von fprintf() behandelt werden können mit fdopen .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top