Namespaces
Variants

std:: ungetc

From cppreference.net
< cpp ‎ | io ‎ | c
Definiert im Header <cstdio>
int ungetc ( int ch, std:: FILE * stream ) ;

Wenn ch nicht gleich EOF ist, schiebt das Zeichen ch (interpretiert als unsigned char ) in den Eingabepuffer, der mit dem Stream stream verbunden ist, auf eine Weise, dass nachfolgende Leseoperationen von stream dieses Zeichen abrufen. Das externe Gerät, das mit dem Stream verbunden ist, wird nicht modifiziert.

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

Wenn ungetc mehr als einmal ohne dazwischenliegendes 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 -Operationen durchgeführt wurden, holen Leseoperationen die zurückgeschobenen Zeichen in umgekehrter Reihenfolge von ungetc

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 std::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 Stream-Positionsindikator auf nicht spezifizierte Weise, garantiert jedoch, dass nach dem Abrufen aller zurückgeschobenen Zeichen durch einen Lesevorgang der Stream-Positionsindikator 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 Fehlschlag 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 die Verwendung von std::ungetc in ihrer ursprünglichen Bestimmung: Implementierung von std::scanf

#include <cctype>
#include <cstdio>
void demo_scanf(const char* fmt, std::FILE* s)
{
    while (*fmt != '\0') {
        if (*fmt == '%') {
            switch (*++fmt) {
                case 'u': {
                    int c{};
                    while (std::isspace(c=std::getc(s))) {}
                    unsigned int num{};
                    while (std::isdigit(c)) {
                        num = num*10 + c-'0';
                        c = std::getc(s);
                    }
                    std::printf("%%u scanned %u\n", num);
                    std::ungetc(c, s);
                    break;
                }
                case 'c': {
                    int c = std::getc(s);
                    std::printf("%%c scanned '%c'\n", c);
                    break;
                }
            }
        } else {
            ++fmt;
        }
    }
}
int main()
{
    if (std::FILE* f = std::fopen("input.txt", "w+")) {
        std::fputs("123x", f);
        std::rewind(f);
        demo_scanf("%u%c", f);
        std::fclose(f);
    }
}

Ausgabe:

%u scanned 123
%c scanned 'x'

Siehe auch

liest ein Zeichen aus einem Dateistrom
(Funktion)
C-Dokumentation für ungetc