ungetc
, ungetwc
Envia um caractere de volta para o fluxo.
Sintaxe
int ungetc(
int c,
FILE *stream
);
wint_t ungetwc(
wint_t c,
FILE *stream
);
Parâmetros
c
O caractere a ser enviado.
stream
Ponteiro para a estrutura FILE
.
Valor retornado
Se tiver sucesso, cada uma dessas funções retornará o argumento do caractere c
. Se não for possível efetuar push de c
ou se nenhum caractere for lido, o fluxo de entrada não será alterado e ungetc
retornará EOF
; ungetwc
retornará WEOF
. Se stream
for NULL
, o manipulador de parâmetro inválido será chamado, conforme descrito em Validação de parâmetro. Se a execução tiver permissão para continuar EOF
ou WEOF
for retornada e errno
for definida como EINVAL
.
Para obter informações sobre esses e outros códigos de erro, confira errno
, _doserrno
, _sys_errlist
e _sys_nerr
.
Comentários
A função ungetc
envia o caractere c
de volta para stream
e limpa o indicador de final do arquivo. O fluxo deve estar aberto para leitura. Uma operação de leitura subsequente começa stream
com c
. Uma tentativa de envio EOF
para o fluxo usando ungetc
será ignorada.
Caracteres colocados no fluxo por ungetc
podem ser apagados se fflush
, fseek
, fsetpos
ou rewind
é chamado antes que o caractere é lido do fluxo. O indicador de posição do arquivo terá o valor que tinha antes que os caracteres foram enviados de volta. O armazenamento externo correspondente para o fluxo não é alterado. Em uma chamada de ungetc
bem-sucedida em um fluxo de texto, o indicador de posição do arquivo não é especificado até que todos os caracteres de retorno enviado sejam lidos ou descartados. Em cada chamada de ungetc
bem-sucedida em um fluxo binário, o indicador de posição do arquivo será reduzido; se o valor for 0 antes de uma chamada, o valor será indefinido após a chamada.
Resultados serão imprevisíveis se ungetc
for chamado duas vezes sem uma operação de leitura ou posicionamento de arquivo entre as duas chamadas. Após uma chamada para fscanf
, uma chamada para ungetc
pode falhar, a menos que outra operação de leitura (como getc
) tenha sido executada, porque fscanf
ela mesma chama ungetc
.
ungetwc
é uma versão de caractere largo de ungetc
. No entanto, em cada chamada de ungetwc
bem-sucedida em um fluxo de texto ou binário, o valor do indicador de posição do arquivo não é especificado até que todos os caracteres de retorno enviado sejam lidos ou descartados.
Essas funções são thread-safe e bloqueiam dados confidenciais durante a execução. Para uma versão sem bloqueio, confira _ungetc_nolock
, _ungetwc_nolock
.
Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.
Mapeamentos de rotina de texto genérico
Rotina TCHAR.H | _UNICODE e _MBCS não definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_ungettc |
ungetc |
ungetc |
ungetwc |
Requisitos
Rotina | Cabeçalho necessário |
---|---|
ungetc |
<stdio.h> |
ungetwc |
<stdio.h> ou <wchar.h> |
Não há suporte para o console em aplicativos UWP (Plataforma Universal do Windows). Os identificadores de fluxo padrão associados ao console, stdin
, stdout
e stderr
, devem ser redirecionados antes que as funções em tempo de execução C possam usá-los em aplicativos UWP. Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
// crt_ungetc.c
// This program first converts a character
// representation of an unsigned integer to an integer. If
// the program encounters a character that is not a digit,
// the program uses ungetc to replace it in the stream.
//
#include <stdio.h>
#include <ctype.h>
int main( void )
{
int ch;
int result = 0;
// Read in and convert number:
while( ((ch = getchar()) != EOF) && isdigit( ch ) )
result = result * 10 + ch - '0'; // Use digit.
if( ch != EOF )
ungetc( ch, stdin ); // Put nondigit back.
printf( "Number = %d\nNext character in stream = '%c'",
result, getchar() );
}
521aNumber = 521
Next character in stream = 'a'