Namespaces
Variants

ungetc

From cppreference.net
< c ‎ | io
Definiert im Header <stdio.h>
int ungetc ( int ch, FILE * stream ) ;

Wenn ch nicht gleich EOF ist, wird das Zeichen ch (interpretiert als unsigned char ) in den Eingabepuffer des Streams stream geschoben, sodass nachfolgende Leseoperationen von stream dieses Zeichen abrufen. Das mit dem Stream verbundene externe Gerät wird nicht modifiziert.

Stream-Positionierungsoperationen fseek , fsetpos und rewind verwerfen die Effekte von ungetc .

Wenn ungetc mehr als einmal ohne zwischengeschrittenes Lesen oder Repositionieren aufgerufen wird, kann es fehlschlagen (mit anderen Worten, ein Pushback-Puffer der Größe 1 ist garantiert, aber jeder größere Puffer ist implementierungsdefiniert). Wenn mehrere erfolgreiche ungetc -Aufrufe durchgeführt wurden, holen Leseoperationen die zurückgestellten Zeichen in umgekehrter Reihenfolge der ungetc -Aufrufe ab.

Wenn ch gleich EOF ist, schlägt der Vorgang fehl und der Stream bleibt unverändert.

Ein erfolgreicher Aufruf von ungetc löscht den End-of-File-Statusindikator feof .

Ein erfolgreicher Aufruf von ungetc auf einem Binärstrom dekrementiert den Strompositionsindikator um eins (das Verhalten ist unbestimmt, wenn der Strompositionsindikator null war).

Ein erfolgreicher Aufruf von ungetc auf einem Textstrom ändert den Strompositionsindikator auf nicht spezifizierte Weise, garantiert jedoch, dass nach dem Abrufen aller zurückgeschobenen Zeichen durch einen Lesevorgang der Strompositionsindikator seinem Wert vor ungetc entspricht.

Inhaltsverzeichnis

Parameter

ch - Zeichen, das in den Eingabestrom-Puffer geschoben werden soll
stream - Dateistrom, an den das Zeichen zurückgegeben werden soll

Rückgabewert

Bei Erfolg wird ch zurückgegeben.

Bei Fehler wird EOF zurückgegeben und der gegebene Stream bleibt unverändert.

Hinweise

Die Größe des Pushback-Puffers variiert in der Praxis von 4k (Linux, MacOS) bis hin zu nur 4 (Solaris) oder dem garantierten Minimum 1 (HPUX, AIX).

Die scheinbare Größe des Pushback-Puffers kann größer sein, wenn das zurückgeschobene Zeichen dem an dieser Stelle in der externen Zeichensequenz vorhandenen Zeichen entspricht (die Implementierung kann einfach den Lese-Dateipositionsindikator dekrementieren und die Pflege eines Pushback-Puffers vermeiden).

Beispiel

Demonstriert den ursprünglichen Zweck von ungetc : Implementierung von 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;
}

Ausgabe:

%u scanned 123
%c scanned 'x'

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.21.7.10 Die ungetc-Funktion (S.: TBD)
  • C17-Standard (ISO/IEC 9899:2018):
  • 7.21.7.10 Die ungetc-Funktion (S: 243)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.21.7.10 Die ungetc-Funktion (S. 334)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.19.7.11 Die ungetc-Funktion (S. 300)
  • C89/C90 Standard (ISO/IEC 9899:1990):
  • 4.9.7.11 Die ungetc-Funktion

Siehe auch

liest ein Zeichen aus einem Dateistrom
(Funktion)