ungetc
|
Défini dans l'en-tête
<stdio.h>
|
||
|
int
ungetc
(
int
ch,
FILE
*
stream
)
;
|
||
Si ch n'est pas égal à EOF , pousse le caractère ch (réinterprété comme unsigned char ) dans le tampon d'entrée associé au flux stream de telle manière que les opérations de lecture ultérieures sur stream récupéreront ce caractère. Le périphérique externe associé au flux n'est pas modifié.
Les opérations de repositionnement de flux
fseek
,
fsetpos
, et
rewind
annulent les effets de
ungetc
.
Si
ungetc
est appelé plus d'une fois sans lecture ou repositionnement intermédiaire, il peut échouer (en d'autres termes, une mémoire tampon de rappel de taille 1 est garantie, mais toute mémoire tampon plus grande est définie par l'implémentation). Si plusieurs appels
ungetc
réussis ont été effectués, les opérations de lecture récupèrent les caractères remis en mémoire tampon dans l'ordre inverse des appels
ungetc
.
Si ch est égal à EOF , l'opération échoue et le flux n'est pas affecté.
Un appel réussi à
ungetc
efface l'indicateur de fin de fichier
feof
.
Un appel réussi à
ungetc
sur un flux binaire décrémente l'indicateur de position du flux de un (le comportement est indéterminé si l'indicateur de position du flux était zéro).
Un appel réussi à
ungetc
sur un flux de texte modifie l'indicateur de position du flux de manière non spécifiée, mais garantit qu'après que tous les caractères repoussés sont récupérés par une opération de lecture, l'indicateur de position du flux est égal à sa valeur avant
ungetc
.
Table des matières |
Paramètres
| ch | - | caractère à replacer dans le tampon de flux d'entrée |
| stream | - | flux de fichier dans lequel replacer le caractère |
Valeur de retour
En cas de succès ch est retourné.
En cas d'échec EOF est retourné et le flux donné reste inchangé.
Notes
La taille du tampon de pushback varie en pratique de 4k (Linux, MacOS) à aussi peu que 4 (Solaris) ou le minimum garanti de 1 (HPUX, AIX).
La taille apparente du tampon de retour en arrière peut être plus grande si le caractère qui est repoussé est égal au caractère existant à cet emplacement dans la séquence de caractères externe (l'implémentation peut simplement décrémenter l'indicateur de position de lecture du fichier et éviter de maintenir un tampon de retour en arrière).
Exemple
Démontre l'objectif initial de
ungetc
: implémentation de
scanf
#include <ctype.h> #include <stdio.h> void demo_scanf(const char* fmt, FILE* s) { while (*fmt != '\0') { if (*fmt == '%') { int c; switch (*++fmt) { case 'u': while (isspace(c=getc(s))) {} unsigned int num = 0; while (isdigit(c)) { num = num*10 + c-'0'; c = getc(s); } printf("%%u scanned %u\n", num); ungetc(c, s); break; case 'c': c = getc(s); printf("%%c scanned '%c'\n", c); break; } } else ++fmt; } } int main(void) { FILE* f = fopen("input.txt", "w+"); if (f != NULL) { fputs("123x", f); rewind(f); demo_scanf("%u%c", f); fclose(f); } return 0; }
Sortie :
%u scanned 123 %c scanned 'x'
Références
- Norme C23 (ISO/IEC 9899:2024) :
-
- 7.21.7.10 La fonction ungetc (p: TBD)
- Norme C17 (ISO/CEI 9899:2018) :
-
- 7.21.7.10 La fonction ungetc (p. 243)
- Norme C11 (ISO/CEI 9899:2011) :
-
- 7.21.7.10 La fonction ungetc (p: 334)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.19.7.11 La fonction ungetc (p : 300)
- Norme C89/C90 (ISO/IEC 9899:1990) :
-
- 4.9.7.11 La fonction ungetc
Voir aussi
|
obtient un caractère d'un flux de fichier
(fonction) |
|
|
Documentation C++
pour
ungetc
|
|