ungetc
|
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) |
|
|
C++ documentation
für
ungetc
|
|