std::ungetc
| Definiert in Header <cstdio> |
||
| int ungetc( int ch, std::FILE *stream ); |
||
Wenn ch nicht gleich EOF ist, wird das Zeichen ch (neu interpretiert als unsigned char) in den Eingabepuffer des Streams stream geschoben, sodass nachfolgende Leseoperationen von stream dieses Zeichen zurückgeben. Das zugehörige externe Gerät wird nicht verändert.
Stream-Positionierungsoperationen wie std::fseek, std::fsetpos und std::rewind verwerfen die Effekte von ungetc.
Wenn ungetc mehr als einmal ohne eine dazwischenliegende Lese- oder Positionierungsoperation aufgerufen wird, kann dies fehlschlagen (d.h., 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 std::feof.
Ein erfolgreicher Aufruf von ungetc auf einem Binärstream dekrementiert den Stream-Positionsindikator um eins (das Verhalten ist unbestimmt, wenn der Stream-Positionsindikator Null war).
Ein erfolgreicher Aufruf von ungetc auf einem Textstream modifiziert den Stream-Positionsindikator auf nicht spezifizierte Weise, garantiert jedoch, dass nach dem Abrufen aller zurückgeschobenen Zeichen durch eine Leseoperation der Stream-Positionsindikator seinem Wert vor ungetc entspricht.
Inhalt |
[bearbeiten] Parameter
| ch | - | Das Zeichen, das in den Eingabestream-Puffer geschoben werden soll |
| stream | - | Der Dateistream, in den das Zeichen zurückgeschoben 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 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-Dateipositionierungsindikator dekrementieren und keinen Pushback-Puffer verwalten).
[bearbeiten] Beispiel
demonstriert die Verwendung von std::ungetc für seinen ursprünglichen Zweck: die 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'
[bearbeiten] Siehe auch
| liest ein Zeichen aus einem Dateistream (function) | |
| C-Dokumentation für ungetc
| |