ungetc
Определено в заголовочном файле <stdio.h> | ||
|---|---|---|
int ungetc( int ch, FILE* stream ); |
Если ch не равно EOF, символ ch (повторно интерпретируемый как unsignedchar) помещается во входной буфер, связанный с потоком stream, таким образом, что последующая операция чтения из stream извлечёт этот символ. Связанное с потоком внешнее устройство не изменяется.
Операции перемещения по потоку fseek, fsetpos и rewind отменяют эффекты ungetc.
Если ungetc вызывается более одного раза без промежуточного чтения или перемещения по потоку, вызов может завершиться неудачей (другими словами, гарантируется буфер возврата размером 1, а любой буфер большего размера определяется реализацией). Если было выполнено несколько успешных вызовов ungetc, операции чтения извлекают возвращённые символы в порядке, обратном порядку ungetc.
Если ch равно EOF, операция завершается неудачей, и поток не изменяется.
Успешный вызов ungetc сбрасывает флаг состояния конца файла feof.
Успешный вызов ungetc для двоичного потока уменьшает индикатор позиции в потоке на единицу (поведение не определено, если индикатор позиции в потоке равен нулю).
Успешный вызов ungetc для текстового потока изменяет индикатор позиции в потоке неопределённым образом, но гарантирует, что после извлечения всех возвращённых символов операцией чтения индикатор позиции в потоке будет равен значению, которое он имел до вызова ungetc.
Параметры
| ch | - | символ, помещаемый во входной буфер потока |
| stream | - | файловый поток, в который возвращается символ |
Возвращаемое значение
В случае успеха возвращается ch.
В случае ошибки возвращается EOF, а переданный поток остаётся неизменным.
Примечания
Размер буфера возврата на практике варьируется от 4 КБ (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++ для ungetc |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/io/ungetc