Namensräume
Varianten
Aktionen

ungetc

Von cppreference.com
< c‎ | io
 
 
Datei-Ein-/Ausgabe
Typen und Objekte
        
Funktionen
Datei-Zugriff
(C95)
Unformatierte Ein-/Ausgabe
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Formatierte Eingabe
Direkte Ein-/Ausgabe
Formatierte Ausgabe
Dateipositionierung
Fehlerbehandlung
Operationen auf Dateien
 
Definiert in Header <stdio.h>
int ungetc( int ch, FILE* stream );

Wenn ch nicht gleich EOF ist, wird das Zeichen ch (neu interpretiert als unsigned char) in den Eingabepuffer, der mit dem Stream stream assoziiert ist, so zurückgeschoben, dass nachfolgende Leseoperationen von stream dieses Zeichen zurückgeben. Das mit dem Stream assoziierte externe Gerät wird nicht verändert.

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

Wenn ungetc mehr als einmal ohne eine dazwischenliegende Lese- oder Positionierungsoperation aufgerufen wird, kann dies fehlschlagen (mit anderen Worten, ein Pushback-Puffer der Größe 1 ist garantiert, aber jeder größere Puffer ist implementierungsabhängig). Wenn mehrere erfolgreiche ungetc-Aufrufe durchgeführt wurden, geben Leseoperationen die zurückgeschobenen Zeichen in umgekehrter Reihenfolge der ungetc-Aufrufe zurück.

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

Ein erfolgreicher Aufruf von ungetc löscht das End-of-File-Statusflag feof.

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

Ein erfolgreicher Aufruf von ungetc auf einem Textstream modifiziert den Stream-Positionsanzeiger auf unbestimmte Weise, garantiert jedoch, dass nach dem Abrufen aller zurückgeschobenen Zeichen durch eine Leseoperation der Stream-Positionsanzeiger gleich seinem Wert vor ungetc ist.

Inhalt

[bearbeiten] Parameter

ch - Zeichen, das in den Eingabestream-Puffer zurückgeschoben werden soll
stream - Dateistream, zu dem das Zeichen zurückgegeben werden soll

[bearbeiten] Rückgabewert

Bei Erfolg wird ch zurückgegeben.

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

[bearbeiten] Hinweise

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

Die scheinbare Größe des Pushback-Puffers kann größer sein, wenn das zurückgeschobene Zeichen mit dem Zeichen an dieser Stelle in der externen Zeichensequenz übereinstimmt (die Implementierung kann einfach den Lese-Dateipositionierungsanzeiger dekrementieren und auf die Beibehaltung eines Pushback-Puffers verzichten).

[bearbeiten] 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'

[bearbeiten] Referenzen

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

[bearbeiten] Siehe auch

liest ein Zeichen aus einem Dateistream
(Funktion) [bearbeiten]
C++ Dokumentation für ungetc