Поделиться через


ungetc, ungetwc

Помещает символ обратно в поток.

Синтаксис

int ungetc(
   int c,
   FILE *stream
);
wint_t ungetwc(
   wint_t c,
   FILE *stream
);

Параметры

c
Символ, который требуется поместить обратно.

stream
Указатель на структуру FILE .

Возвращаемое значение

При успешном выполнении каждая из этих функций возвращает аргумент cсимвола. Если c не удается отправить назад или если символ не был прочитан, входной поток не изменяется и ungetc возвращается; ungetwc возвращаетсяEOFWEOF. В противном streamNULLслучае вызывается недопустимый обработчик параметров, как описано в разделе "Проверка параметров". Если выполнение разрешено продолжать или EOFWEOF возвращается, и 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). Стандартные дескрипторы потока, связанные с консолью, stdinstdoutи 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'

См. также

Потоковый ввод-вывод
getc, getwc
putc, putwc