Função do tipo "fprintf" para descritores de arquivos (ou seja, int fd em vez de arquivo* fp)

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

  •  27-09-2019
  •  | 
  •  

Pergunta

Talvez eu esteja apenas perdendo, mas não existe uma função equivalente ao FPRINTF para descritores de arquivos, ou mesmo uma maneira de virar temporariamente entre eles?

Foi útil?

Solução

Você poderia olhar para dprintf (Extensões GNU, não em C ou Posix) :

As funções dPrintf () e vdPrintf () (como encontrado na biblioteca glibc2) são análogos exatos de fprintf () e vfprintf (), exceto que eles geram para um descritor de arquivo FD em vez de para um determinado fluxo.

EDITAR Conforme apontado por vários de vocês nos comentários, Posix 2008 padronizou essas funções.

Outras dicas

Não há função padrão C ou POSIX (editar: antes de 2008) printf em um descritor de arquivo, mas você pode "abrir" um descritor de arquivo como um FILE * com o padrão Posix fdopen(int desc, const char *mode). Não tenho certeza do quão bem suportado voltar a usar o descritor diretamente, mas acho que pode funcionar se você liberar o buffer primeiro ...

Claro que você pode simplesmente implementar o seu próprio usando algo como vsprintf, mas obviamente você precisa cuidar do buffer.

Pelo que vale a pena, já dprintf não é uma função POSIX, pode -se usar o seguinte se a portabilidade for um 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;
}

Provavelmente gostaria de verificar o valor de retorno de write, mas você tem a ideia geral. Obviamente, isso não buffer como o FILE * rotinas fazem; Eu estava procurando mais os especificadores de formato e a capacidade de criar os dados de caracteres que seriam gravados no descritor de arquivo, em vez de se preocupar em buffer os dados à medida que estão sendo gravados.

Não, não há como padrão, mas os dois fazem coisas diferentes. O FPRinft, como parte do stdio, faz coisas como leituras e gravações de buffer, suporta ungetc etc. O uso de um FD ignora tudo isso e chama o sistema operacional diretamente.

Portanto, eles não são intercambiáveis. Flip Floping entre eles estragaria o buffer de stdio se nada mais

Você pode abrir o descritor de arquivo como um arquivo normal que pode ser tratado por fprintf() com fdopen.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top