“Fprintf” -como función de los descriptores de archivos (es decir, int fd en lugar de FILE * fp)

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

  •  27-09-2019
  •  | 
  •  

Pregunta

Tal vez estoy perdiendo, pero no está allí una función equivalente a fprintf de descriptores de archivos, o incluso una manera de forma temporal flip-flop entre ellos?

¿Fue útil?

Solución

dprintf ( extensiones de GNU, no en C o POSIX ):

  

Las funciones dprintf () y vdprintf ()   (Como se encuentra en la biblioteca glibc2) son   análogos exactos de fprintf () y   vfprintf (), excepto que la salida de   un descriptor de fichero fd en lugar de a una   flujo dado.

Editar Como se ha señalado por varios de ustedes en los comentarios, POSIX 2008 estandarizada estas funciones.

Otros consejos

No hay C o POSIX (edit: antes de 2008) la función estándar de hacer printf en un descriptor de archivo, pero puede un descriptor de archivo “abierto” como FILE * con el fdopen(int desc, const char *mode) POSIX estándar. No estoy seguro de lo bien apoyado volver a mover de un tirón usando el descriptor está directamente, pero supongo que podría funcionar si vaciar el búfer primero ...

Por supuesto que sólo podría implementar su propio usando algo como vsprintf, pero es evidente que luego tiene que hacerse cargo de la amortiguación.

Por lo que vale la pena, ya que dprintf no es una función POSIX, se podría utilizar la siguiente si la portabilidad es 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;
}

Lo más probable sería que desee comprobar el valor de retorno de write, pero usted consigue la idea general. Obviamente, esto no almacena como el FILE * rutinas hacen; Yo estaba buscando más por los especificadores de formato y la capacidad de construir los datos de caracteres que se escriben en el descriptor de archivo, en lugar de preocuparse amortiguar los datos a medida que se está escribiendo.

No, no es de serie, pero los dos hacen cosas diferentes. fprinft, como parte de stdio, hace cosas como búfer lee y escribe, soportes ungetc etc. Usando un fd no pasa por todo eso y llama al sistema operativo directamente.

Así que no son intercambiables. tirarse tirón entre ellos sería arruinar búfer stdio si nada más

Puede abrir el descriptor de archivo como un archivo normal que puede ser manejado por fprintf() con fdopen .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top