std:: ungetc
|
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
|
|