Namespaces
Variants

ungetc

From cppreference.net
< c ‎ | io
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)