Pergunta

Por alguns motivos, preciso de um ponteiro de arquivo (FILE *) que não aponte para nada.Isso significa que posso passá-lo para a função fprintf e fprintf ignorar o ponteiro do arquivo.

por exemplo:

void my_function()
{
  FILE* nothing = NULL; // NULL is not correct.
  int n = fprintf(nothing, "PI = %f", 3.14); // Note: When nothing = NULL, error ocured.
}

Existe um ponteiro de arquivo (FILE *) que não aponta para nada?

Foi útil?

Solução

não.

Seu código causará uma exceção de tempo de execução.Você pode usar o /dev/null, por exemplo, se você estiver em execução em um sistema operacional que o suporte, mas não há nada parecido incorporado em C ++.

Outras dicas

Para resolver seu problema real (declarado nos comentários), use snprintf em vez de printf, desde que esteja disponível em sua implementação C ++ (o que não é garantido em C ++ 03).Passe um ponteiro nulo para o buffer e 0 para o tamanho.Nada é escrito, mas o valor de retorno é o comprimento da string formatada (excluindo terminador nul).

[Editar: ops, esqueci que snprintf no Windows não está em conformidade com C99.Ele retorna um erro se ocorrer truncamento, não o comprimento necessário.Não sei o que eles farão sobre o fato de que C ++ 0x requer um snprintf em conformidade com C99.]

Para responder à sua pergunta, você pode abrir /dev/null em sistemas semelhantes ao UNIX ou nul no Windows.As gravações no FILE* resultante não têm efeito.No entanto, não existe um dispositivo nulo portátil.

por que não envolver a chamada do método fprintf com uma instrução if (NULL != nothing)?

Embora, como o NirMH disse, você possa incluí-lo em if (nothing != NULL), há outra maneira.Você pode abrir um arquivo no modo de leitura (com "r") e ao enviá-lo para fprintf, a gravação é ignorada (Editar: conforme discutido nos comentários, lembre-se de definir n=0 se for negativo conforme retornado por fprintf).

No entanto, eu pessoalmente sugiro o primeiro método.A única razão pela qual posso fazer a segunda é se não consigo alterar a função.

Se você não se importa se o seu código depende do sistema, você pode usar /dev/null no linux, nul no Windows etc,

Você está cometendo um erro de design.

Obviamente, o que você quer saber é o número de caracteres necessários para escrever seu número.

Você está usando _ * printf_ para isso, o que é uma boa idéia. Você apenas deseja calcular o número de caracteres "escritos", portanto, necessários. Mas você não quer que nada seja exibido, então você clicou em fprintf ao invés de apenas printf . Mas fprintf não funciona sem um FILE para escrever ...

Como Steve disse, você deve preferir usar snprintf () , que escreve em uma string na memória.

Como diz steve, snprintf fornecido com uma string NULL deve funcionar como planejado, exceto em janelas. Em seguida, no Windows, basta fornecer uma string temporária que você descartará depois.

size_t computeNumCharsNeededToPrintMyStuff(double d)
{
    size_t ret = 0;
    size_t maxBuffSize = 100; // should be plenty enough

    char *tmpBuff = new char[maxBuffSize ];
    ret = snprintf(tmpBuff, maxBuffSize, "PI = %f", d);
    delete[] tmpBuff;

    return ret;
}

Então basta ligar para:

n = computeNumCharsNeededToPrintMyStuff(3.14)

(Esta função pode ser aprimorada para calcular o tamanho necessário para exibir qualquer coisa, mas prefiro mantê-la simples por enquanto.)

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