ungetc
|
Определено в заголовочном файле
<stdio.h>
|
||
|
int
ungetc
(
int
ch,
FILE
*
stream
)
;
|
||
Если ch не равен EOF , помещает символ ch (интерпретируемый как unsigned char ) во входной буфер, связанный с потоком stream таким образом, что последующие операции чтения из stream будут извлекать этот символ. Внешнее устройство, связанное с потоком, не изменяется.
Операции перепозиционирования потока
fseek
,
fsetpos
и
rewind
отменяют эффекты
ungetc
.
Если
ungetc
вызывается более одного раза без промежуточного чтения или изменения позиции, операция может завершиться неудачей (другими словами, гарантирован буфер возврата размером 1, но любой буфер большего размера определяется реализацией). Если было выполнено несколько успешных вызовов
ungetc
, операции чтения извлекают возвращённые символы в порядке, обратном порядку вызовов
ungetc
.
Если ch равен EOF , операция завершается неудачей и поток не изменяется.
Успешный вызов
ungetc
сбрасывает флаг состояния конца файла
feof
.
Успешный вызов
ungetc
для бинарного потока уменьшает индикатор позиции потока на единицу (поведение не определено, если индикатор позиции потока был равен нулю).
Успешный вызов
ungetc
для текстового потока изменяет индикатор позиции потока неопределённым образом, но гарантирует, что после извлечения всех возвращённых символов операцией чтения, индикатор позиции потока будет равен своему значению до вызова
ungetc
.
Содержание |
Параметры
| ch | - | символ для помещения обратно в буфер входного потока |
| stream | - | файловый поток, в который возвращается символ |
Возвращаемое значение
При успешном выполнении ch возвращается.
При неудаче EOF возвращается, а заданный поток остается неизменным.
Примечания
Размер буфера pushback на практике варьируется от 4k (Linux, MacOS) до всего лишь 4 (Solaris) или гарантированного минимума 1 (HPUX, AIX).
Видимый размер буфера возврата может быть больше, если возвращаемый символ равен символу, существующему в этой позиции во внешней символьной последовательности (реализация может просто уменьшить индикатор позиции чтения файла и избежать поддержания буфера возврата).
Пример
Демонстрирует первоначальное предназначение
ungetc
: реализация
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; }
Вывод:
%u scanned 123 %c scanned 'x'
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 7.21.7.10 Функция ungetc (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.21.7.10 Функция ungetc (стр. 243)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.21.7.10 Функция ungetc (стр. 334)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.19.7.11 Функция ungetc (стр. 300)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 4.9.7.11 Функция ungetc
Смотрите также
|
получает символ из файлового потока
(функция) |
|
|
C++ documentation
для
ungetc
|
|