ungetc
, ungetwc
Помещает символ обратно в поток.
Синтаксис
int ungetc(
int c,
FILE *stream
);
wint_t ungetwc(
wint_t c,
FILE *stream
);
Параметры
c
Символ, который требуется поместить обратно.
stream
Указатель на структуру FILE
.
Возвращаемое значение
При успешном выполнении каждая из этих функций возвращает аргумент c
символа. Если c
не удается отправить назад или если символ не был прочитан, входной поток не изменяется и ungetc
возвращается; ungetwc
возвращаетсяEOF
WEOF
. В противном stream
NULL
случае вызывается недопустимый обработчик параметров, как описано в разделе "Проверка параметров". Если выполнение разрешено продолжать или EOF
WEOF
возвращается, и errno
задано значение EINVAL
.
Дополнительные сведения об этих и других кодах ошибок см. в разделе errno
, _doserrno
_sys_errlist
и _sys_nerr
.
Замечания
Функция ungetc
помещает символ c
обратно в stream
и удаляет индикатор конца файла. Поток должен быть открыт для чтения. Следующая операция stream
чтения начинается с c
. Попытка отправить EOF
в поток с помощью ungetc
игнорируется.
Символы, помещенные в поток с помощью ungetc
, могут быть удалены, если fflush
, fseek
, fsetpos
или rewind
вызывается перед считыванием символа из потока. Индикатор позиции в файле будет иметь значение, которое было до помещения символов обратно. Внешнее хранилище, соответствующее потоку, не изменяется. При успешном вызове ungetc
для текстового потока индикатор позиции в файле будет не задан до тех пор, пока все помещенные обратно символы не будут считаны или удалены. При каждом успешном вызове ungetc
для двоичного потока индикатор позиции файла уменьшается; если перед вызовом он имел значение 0, то после вызова его значение будет неопределенным.
Если ungetc
вызывается дважды без выполнения между вызовами операции чтения или размещения в файле, результаты будут непредсказуемыми. После вызова вызов может ungetc
завершиться ошибкой, если не выполнена другая операция чтения (напримерgetc
), так как fscanf
сама вызываетсяungetc
.fscanf
ungetwc
— это версия функции ungetc
для расширенных символов. Однако при каждом успешном вызове ungetwc
для текстового или двоичного потока значение индикатора позиции в файле будет не задано до тех пор, пока все помещенные обратно символы не будут считаны или удалены.
Эти функции являются потокобезопасными и блокируют конфиденциальные данные во время выполнения. Сведения о версии, отличной от блокировки, см. в статье _ungetc_nolock
. _ungetwc_nolock
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.
Сопоставления подпрограмм универсального текста
Подпрограмма TCHAR.H | _UNICODE и _MBCS не определен |
_MBCS Определенные |
_UNICODE Определенные |
---|---|---|---|
_ungettc |
ungetc |
ungetc |
ungetwc |
Требования
Маршрут | Обязательный заголовок |
---|---|
ungetc |
<stdio.h> |
ungetwc |
<stdio.h> или <wchar.h> |
Консоль не поддерживается в приложениях универсальная платформа Windows (UWP). Стандартные дескрипторы потока, связанные с консолью, stdin
stdout
и stderr
, должны быть перенаправлены перед тем, как функции времени выполнения C могут использовать их в приложениях UWP. Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// crt_ungetc.c
// This program first converts a character
// representation of an unsigned integer to an integer. If
// the program encounters a character that is not a digit,
// the program uses ungetc to replace it in the stream.
//
#include <stdio.h>
#include <ctype.h>
int main( void )
{
int ch;
int result = 0;
// Read in and convert number:
while( ((ch = getchar()) != EOF) && isdigit( ch ) )
result = result * 10 + ch - '0'; // Use digit.
if( ch != EOF )
ungetc( ch, stdin ); // Put nondigit back.
printf( "Number = %d\nNext character in stream = '%c'",
result, getchar() );
}
521aNumber = 521
Next character in stream = 'a'