ungetc
, ungetwc
Renvoie un caractère dans le flux via une transmission de type push.
Syntaxe
int ungetc(
int c,
FILE *stream
);
wint_t ungetwc(
wint_t c,
FILE *stream
);
Paramètres
c
Caractère à renvoyer (transmission push).
stream
Pointeur vers la structure FILE
.
Valeur retournée
En cas de réussite, chacune de ces fonctions retourne l’argument de caractère c
. Si c
ne peut pas être renvoyé ou si aucun caractère n’a été lu, le flux d’entrée reste inchangé et ungetc
retourne EOF
; ungetwc
retourne WEOF
. Si stream
a la valeur NULL
, le gestionnaire de paramètre non valide est appelé, comme décrit dans Validation de paramètre. Si l’exécution est autorisée à continuer, EOF
ou WEOF
est retournée, et errno
est définie sur EINVAL
.
Pour plus d’informations sur ces codes et d’autres codes d’erreur, consultez errno
, _doserrno
, _sys_errlist
et _sys_nerr
.
Notes
La fonction ungetc
renvoie le caractère c
à stream
via une transmission de type push et efface l’indicateur de fin de fichier. Le flux doit être ouvert pour lecture. Une opération de lecture suivante commence stream
par c
. Une tentative de transmission de type push de EOF
vers le flux à l’aide de ungetc
est ignorée.
Les caractères positionnés dans le flux par ungetc
peuvent être effacés si la fonction fflush
, fseek
, fsetpos
ou rewind
est appelée avant que le caractère soit lu dans le flux. L’indicateur de position de fichier prend alors la valeur qui était la sienne avant que les caractères soient renvoyés via la transmission push. Le stockage externe correspondant au flux est inchangé. Si l’appel de la fonction ungetc
pour un flux de texte aboutit, l’indicateur de position de fichier n’est pas spécifié tant que tous les caractères renvoyés via une transmission push ne sont pas lus ou ignorés. À chaque appel réussi de la fonction ungetc
sur un flux binaire, l’indicateur de position de fichier est décrémenté ; si sa valeur était égale à 0 avant un appel, la valeur est indéfinie après l’appel.
Les résultats sont imprévisibles si la fonction ungetc
est appelée à deux reprises sans qu’aucune opération de lecture ou de positionnement de fichier n’ait lieu entre les deux appels. Après un appel à fscanf
, un appel peut ungetc
échouer, sauf si une autre opération de lecture (par exemple getc
) a été effectuée, car fscanf
elle appelle elle-même ungetc
.
ungetwc
est une version à caractères larges de ungetc
. Cependant, à chaque appel réussi de la fonction ungetwc
sur un flux de texte ou binaire, la valeur de l’indicateur de position de fichier n’est pas spécifié tant que tous les caractères renvoyés via une transmission push ne sont pas lus ou ignorés.
Ces fonctions sont thread-safe et verrouillent les données sensibles pendant l’exécution. Pour obtenir une version non verrouillée, consultez _ungetc_nolock
, _ungetwc_nolock
.
Par défaut, l’état global de cette fonction est limité à l’application. Pour modifier ce comportement, consultez État global dans le CRT.
Mappages de routines de texte générique
Routine TCHAR.H | _UNICODE et _MBCS non définis |
_MBCS défini |
_UNICODE défini |
---|---|---|---|
_ungettc |
ungetc |
ungetc |
ungetwc |
Spécifications
Routine | En-tête requis |
---|---|
ungetc |
<stdio.h> |
ungetwc |
<stdio.h> ou <wchar.h> |
La console n’est pas prise en charge dans les applications de la plateforme Windows universelle (UWP). Les handles de flux standard associés à la console (stdin
, stdout
et stderr
) doivent être redirigés pour que les fonctions de runtime C puissent les utiliser dans les applications UWP. Pour plus d’informations sur la compatibilité, consultez Compatibility.
Exemple
// 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'