subrotinas fwprintf, wprintf, swprintf

Propósito

Imprimir saída de caráter amplo formatado.

Biblioteca

Biblioteca Padrão (libc.a)

Sintaxe

#include <stdio.h>
#include <wchar.h>
int fwprintf ( FILE * stream, const wchar_t * format, . . .)
int wprintf (const wchar_t * format, . .)
int swprintf (wchar_t *s, size_t n, const wchar_t * format, . . .)

Descrição

A função fwprintf coloca saída no fluxo de saída nomeado. A função wprintf coloca a saída no fluxo de saída padrão stdout. A função swprintf coloca saída seguida do caractere de largura nula em caracteres de largura consecutivos iniciando em * s; não mais do que n wide-caracteres são escritos, incluindo um caractere de largura nula de terminação, que é sempre adicionado (a menos que n seja zero).

Cada uma dessas funções se converte, formata e imprime seus argumentos sob controle da cadeia de caracteres de todo o formato . O formato é composto por zero ou mais diretivas: caracteres amplos ordinários, que são simplesmente copiadas para o fluxo de saída e especificações de conversão , cada uma das quais resulta na busca de zero ou mais argumentos. Os resultados são indefinidos se houver argumentos insuficientes para o formato. Se o formato estiver esgotado enquanto os argumentos permanecem, os argumentos em excesso são avaliados mas são ignorados de outra forma.

As Conversões EX podem ser aplicadas no argumento nês após o formato na lista de argumentos, em vez de para o próximo argumento não utilizado. Neste caso, o wide-character% (ver abaixo) é substituído pela sequência %n$, em que n é um inteiro decimal no intervalo [1, {NL_ARGMAX}], dando a posição do argumento na lista de argumentos. Este recurso prevê a definição de strings de caracteres de formato amplo que selecionam argumentos em uma ordem apropriada para linguagens específicas (veja a seção EXEMPLOS).

Em sequências de caracteres de formato amplo contendo a forma %n$ de especificações de conversão, argumentos numerados na lista de argumentos podem ser referenciados a partir da cadeia de caracteres de caracteres de formato amplo quantas vezes for necessário.

Em formato de strings de caracteres de grande formato contendo a forma% de especificações de conversão, cada argumento na lista de argumentos é usado exatamente uma vez.

Todas as formas das funções fwprintf permitem a inserção de um caractere de radix dependente de linguagem na cadeia de saída, saída como um valor de amplo caráter. O caractere radix é definido no locale do programa (category LC_NUMÉRICO). No locale POSIX , ou em um locale onde o caractere radix não é definido, o caractere radix padronizado para um período (.).

EX Cada especificação de conversão é introduzida pela% de amplo caráter ou pela sequência de caracteres de grande caráter %n$, após a qual aparecem os seguintes em sequência:

  • Zero ou mais bandeiras (em qualquer ordem), que modificam o significado da especificação de conversão.
  • Um mínimo opcional largura do campo. Se o valor convertido tiver menos caracteres amplos que a largura do campo, ele será preenchido com espaços por padrão à esquerda; ele será preenchido à direita, se a sinalização de reajuste de esquerda (-), descrita abaixo, for dada à largura do campo. A largura de campo assume a forma de um asterisco (*), descrito abaixo, ou um inteiro decimal.
  • Um precisão opcional que dá o número mínimo de dígitos para aparecer para as conversões d, i, o, u, x e X ; o número de dígitos a aparecer após o caractere radix para as conversões de e, E e f; o número máximo de dígitos significativos para as conversões g e G; ou o número máximo de caracteres largos a serem impressos a partir de uma string em s conversões. A precisão toma a forma de um período (.) seguido de um asterisco (*), descrito a seguir, ou uma sequência de algarismos decimal opcional, em que uma cadeia de algarismos nulos é tratada como 0. Se uma precisão aparece com qualquer outro caráter amplo de conversão, o comportamento é indefinido.
  • Um l opcional (lowercase L), L, h, H, D ou DD especifica uma das seguintes conversões:
    • Um l opcional especificando que um seguinte caractere de conversão c se aplica a um argumento wint_t .
    • Um l opcional especificando que um seguinte caractere de conversão s se aplica a um argumento wchar_t .
    • Um l opcional especificando que um seguinte caractere d, eu, o, u, x ou X de conversão de caracteres aplica-se a um argumento tipo longa int ou longo int unsigned .
    • Um l opcional especificando que um seguinte caractere de conversão n se aplica a um ponteiro a um argumento tipo longa int .
    • Um L opcional especificando que um seguinte caractere de conversão e, E, f, g ou G , aplica-se a um argumento tipo longo duplo .
    • Um h opcional especificando que um caractere de conversão de d, eu, o, u, x ou X , aplica-se a um argumento tipo curta int ou tipo curta int unsigned (o argumento que será promovido de acordo com as promoções integrais, e seu valor será convertido para o tipo curta int ou curta int unsigned antes da impressão).
    • Um h opcional especificando que um seguinte caractere de conversão n se aplica a um ponteiro a um argumento tipo curta int .
    • Um H opcional especificando que um seguinte caractere e, E, f, gou G de conversão de caracteres aplica-se a um parâmetro _Decimal32 .
    • Um D opcional especificando que um seguinte caractere e, E, f, gou G de conversão de caracteres aplica-se a um parâmetro _Decimal64 .
    • Um DD opcional especificando que um seguinte caractere e, E, f, gou G de conversão de caracteres aplica-se a um parâmetro _Decimal128 .
    Se um l, L , h, H, Dou DD aparecer com qualquer outro caractere de ampla conversão, o comportamento será indefinido.
  • Um conversão de caráter amplo que indica o tipo de conversão a ser aplicada.

Uma largura de campo, ou precisão, ou ambas, pode ser indicada por um asterisco (*). Nesse caso um argumento do tipo int fornece a largura de campo ou precisão. Argumentos especificando largura de campo, ou precisão, ou ambos devem aparecer nessa ordem antes do argumento, se houver, para ser convertido. Uma largura de campo negativa é tida como uma-bandeira seguida de uma largura de campo positiva. Uma precisão negativa é tomada como se EX a precisão fosse omitida. Em format wide-character strings contendo a forma %n$ de uma especificação de conversão, uma largura de campo ou precisão pode ser indicada pela sequência * m$, em que m é um inteiro decimal na faixa [1, {NL_ARGMAX}] dando a posição na lista de argumentos (após o argumento format) de um argumento inteiro contendo a largura de campo ou precisão, por exemplo:

 wprintf(L"%1$d:%2$.*3$d:%4$.*3$d\n", hour, min, precision, sec);

O formato pode conter especificações de argumento numeradas (ou seja, %n$ e * m$), ou especificações de argumento não numeradas (ou seja,% e *), mas normalmente não ambas. A única exceção a isso é que%% pode ser misturado com o formulário %n$ . Os resultados de mixagem de especificações de argumentos numerados e não numerados em uma sequência de caracteres de grande alcance de formato são indefinidos. Quando especificações de argumento numeradas são usadas, especificar o argumento Nth requer que todos os argumentos líderes, da primeira para a (N-1) th, sejam especificados na string de formato de caracteres.

A bandeira wide-caracteres e seus significados são:

Item Descrição
' A parte de número inteiro do resultado de uma conversão decimal (%i, %d, %u, %f, %g ou %G) será formatada com milhares de caracteres de agrupamento. Para outras conversões o comportamento é indefinido. Usa-se o agrupamento não monetário de caráter amplo.
- O resultado da conversão será deixado-justificado dentro de campo. A conversão será certa-justificada se esta sinalização não for especificada.
+ O resultado de uma conversão assinada sempre começará com um sinal (+ ou-). A conversão começará com um sinal apenas quando um valor negativo for convertido se esta bandeira não for especificada.
espaço Se o primeiro amplo-caráter de uma conversão assinada não for um sinal ou se um sinal de conversão assinado em caracteres sem caracteres amplos, um espaço será prefixado ao resultado. Isso significa que se as bandeiras do espaço e + ambas aparecerão, a bandeira do espaço será ignorada.
# Esta sinalização especifica que o valor deve ser convertido para um formulário alternativo. Para a conversão, aumenta a precisão (se necessário) para forçar o primeiro dígito do resultado a ser 0. Para conversões x ou X, um resultado diferente de zero terá 0x (ou 0X) prefixado a ele. Para conversões de e, E, f, g ou G, o resultado sempre conterá um caractere de radix, mesmo que nenhum algarismo a acompanhemos. Sem esta bandeira, um caractere de radix aparece no resultado dessas conversões apenas se um dígito a seguir. Para conversões de g e G, os zeros rasos serão não removidos do resultado como normalmente são. Para outras conversões, o comportamento é indefinido.
0 Para as conversões d, i, o, u, u, x, X, e, E, f, g e G, os zeros iniciais (seguindo qualquer indicação de sinal ou base) são usados para pad à largura do campo; nenhum preenchimento de espaço é realizado. Se os 0 e-bandeiras ambas aparecerão, a bandeira de 0 será ignorada. Para as conversões d, i, o, u, x e X, se uma precisão for especificada, a bandeira de 0 será ignorada. Se os 0 e ' sinalizadores ambos aparecem, o agrupamento de caracteres amplos são inseridos antes de zero padding. Para outras conversões, o comportamento é indefinido.

Os caracteres amplos de conversão e seus significados são:

Item Descrição
d, eu O argumento int é convertido em um decimal assinado no estilo [-] dddd. A precisão especifica o número mínimo de dígitos a aparecer; se o valor que está sendo convertido pode ser representado em menos algaristas, ele será expandido com zeros de liderança. A precisão padrão é 1. O resultado da conversão 0 com uma precisão explícita de 0 não é de caracteres amplos.
o O argumento int unsigned é convertido em formato octal não assinado no estilo dddd. A precisão especifica o número mínimo de dígitos a aparecer; se o valor que está sendo convertido pode ser representado em menos algaristas, ele será expandido com zeros de liderança. A precisão padrão é 1. O resultado da conversão 0 com uma precisão explícita de 0 não é de caracteres amplos.
u O argumento int unsigned é convertido em formato decimal não assinado no estilo dddd. A precisão especifica o número mínimo de dígitos a aparecer; se o valor que está sendo convertido pode ser representado em menos algaristas, ele será expandido com zeros de liderança. A precisão padrão é 1. O resultado da conversão 0 com uma precisão explícita de 0 não é de caracteres amplos.
X O argumento int unsigned é convertido em formato hexadecimal não assinado no estilo dddd; as letras abcdef são usadas. A precisão especifica o número mínimo de dígitos a aparecer; se o valor que está sendo convertido pode ser representado em menos algaristas, ele será expandido com zeros de liderança. A precisão padrão é 1. O resultado da conversão 0 com uma precisão explícita de 0 não é de caracteres amplos.
X Comporta-se o mesmo que o caractere x de conversão de x exceto que letras ABCDEF são usadas em vez de abcdef.
f O argumento double é convertido em notação decimal no estilo [-] ddd.ddd, onde o número de dígitos após o caractere radix é igual à especificação de precisão. Se a precisão está faltando, ela é tomada como 6; se a precisão é explícita 0 e nenhuma # bandeira está presente, nenhum caractere de radix aparece. Se aparecer um caractere de radix, pelo menos um dígito aparece antes dele. O valor é arredondado para o número adequado de algarías.
A família de funções fwprintf pode disponibilizar representações de sequência de caracteres amplos para infinito e NaN.
e, E O argumento double é convertido no estilo [-] d.ddde +/-dd, em que há um dígito antes do caractere radix (que será diferente de zero se o argumento for diferente de zero) e o número de dígitos depois que ele for igual à precisão; se a precisão estiver ausente, ela será considerada 6; se a precisão for 0 e nenhum sinalizador # estiver presente, nenhum caractere radix aparecerá. O valor é arredondado para o número adequado de algarías. O wide-character de conversão E irá produzir um número com E em vez de e introduzindo o expoente. O expoente sempre contém pelo menos dois algaríos. Se o valor for 0, o expoente é 0.
A família de funções fwprintf pode disponibilizar representações de sequência de caracteres amplos para infinito e NaN.
g, G O argumento duplo é convertido no estilo f ou e (ou no estilo E no caso de um caractere G de conversão de um G), com a precisão especificando o número de algarismo significativos. Se uma precisão explícita for 0, ela é tomada como 1. O estilo usado depende do valor convertido; o estilo e (ou E) será usado somente se o expoente resultante dessa conversão for menor que -4 ou maior ou igual à precisão. Os zeros trailing são removidos da parte fracionária do resultado; um caractere de radix aparece apenas se for seguido por um dígito.
A família de funções fwprintf pode disponibilizar representações de sequência de caracteres amplos para infinito e NaN.
c Se nenhum qualificador l (ell) estiver presente, o argumento int é convertido para um amplo caractere como se ao chamar a função btowc e o amplo caractere de abrangência for escrito. Caso contrário o argumento wint_t é convertido para wchar_t, e escrito.
s Se nenhum l (ell) qualificador estiver presente, o argumento deve ser um ponteiro para uma matriz de caracteres contendo uma sequência de caracteres iniciando no estado de turno inicial. Caracteres da matriz são convertidos como se por chamadas repetidas para a função mbrtowc , com o estado de conversão descrito por um objeto mbstate_t inicializado a zero antes de o primeiro caractere ser convertido, e escrito até (mas não incluindo) a terminação de wide-character null. Se a precisão for especificada, não mais do que muitas laras caracteres são escritos. Se a precisão não for especificada ou for maior do que o tamanho da matriz, a matriz deve conter um caractere de largura nulo.
Se um qualificador l (ell) estiver presente, o argumento deve ser um ponteiro para uma matriz do tipo wchar_t. Caracteres amplos da matriz são escritos até (mas não incluindo) uma terminação de caráter amplo nulo. Se nenhuma precisão for especificada ou for maior do que o tamanho da matriz, a matriz deve conter um caractere de largura nulo. Se uma precisão é especificada, não mais do que muitas laras caracteres são escritos.
P O argumento deve ser um ponteiro para anular. O valor do ponteiro é convertido para uma sequência de caracteres de largura impressa, de forma independente. O argumento deve ser um ponteiro para um inteiro no qual está escrito o número de caracteres amplos gravados na saída até agora por esta chamada para uma das funções fwprintf . Nenhum argumento é convertido.
C O mesmo que lc.
S O mesmo que ls.
% Saída a% ampla-caracter; nenhum argumento é convertido. A especificação de conversão inteira deve ser %%.

Se uma especificação de conversão não corresponder a uma das formas acima, o comportamento será indefinido.

Em nenhum caso uma largura de campo inexistente ou pequena causa truncamento de um campo; se o resultado de uma conversão for mais largo do que a largura do campo, o campo é simplesmente expandido para conter o resultado da conversão. Os caracteres gerados por fwprintf e wprintf são impressos como se fputwc tivesse sido chamado.

Os campos st_ctime e st_mtime do arquivo serão marcados para atualização entre a chamada para uma execução bem-sucedida de fwprintf ou wprintf e a próxima conclusão bem-sucedida de uma chamada para fflush ou ffechar no mesmo fluxo ou uma chamada para sair ou abortar.

Valores De Retorno

Após a conclusão bem-sucedida, essas funções retornam o número de caracteres amplos transmitidos excluindo-se a terminação de wide-character nula no caso de swprintf ou um valor negativo se um erro de saída foi encontrado.

Códigos De Erro

Para as condições sob as quais fwprintf e wprintf falharão e podem falhar, consulte o fputwc. Além disso, todas as formas de fwprintf podem falhar se:

Item Descrição
EILSEQ Um código de caráter amplo que não corresponde a um caractere válido foi detectado
EINVAL Há argumentos insuficientes.
Além disso, wprintf e fwprintf podem falhar se:
ENOMEM O espaço de armazenamento insuficiente está disponível.

O swprintf falhará se:

Item Descrição
EOVERFLOW O valor de n é maior que {INT_MAX} ou o número de bytes necessários para segurar a saída excluindo o null terminating é maior que {INT_MAX}.

Exemplos

Para imprimir o formato de data e hora independente do idioma, poderá ser utilizada a seguinte declaração:

 wprintf (format, weekday, month, day, hour, min);

Para o uso americano, o formato poderia ser um ponteiro para a cadeia de caracteres de grande caráter:

 L"%s, %s %d, %d:%.2d\n"

produzindo a mensagem:

 Sunday, July 3, 10:02

que para o uso alemão, o formato poderia ser um ponteiro para a cadeia de caracteres ampla:

L"%1$s, %3$d. %2$s, %4$d:%5$.2d\n"

produzindo a mensagem:

 Sonntag, 3. July, 10:02