ungetc () в C / C ++

Опубликовано: 30 Декабря, 2021

Функция ungetc () берет один символ и отправляет его обратно во входной поток. Это противоположность функции getc (), которая считывает один символ из входного потока. Кроме того, ungetc () - это функция ввода, а не функция вывода.
Синтаксис:

 int ungetc (int char, FILE * поток)

Параметры:

  • char : указывает продвижение символа int, который нужно вернуть. При возврате значение внутренне преобразуется в беззнаковый символ.
  • stream : указывает указатель на объект FILE, который идентифицирует входной поток.

Возвращаемое значение: функция возвращает два типа значений.

  • В случае успеха функция ungetc () возвращает символ ch.
  • В случае сбоя EOF возвращается без изменения потока.

Важные моменты о функции:

  1. Функция ungetc () проталкивает байт, указанный параметром char (преобразованный в символ без знака), обратно во входной поток, на который указывает stream.
  2. Возвращенные байты возвращаются последующими чтениями в этом потоке в порядке, обратном их отправке.
  3. Успешный промежуточный вызов (с потоком, на который указывает stream) функции позиционирования файла (fseek (), fsetpos () или rewind ()) отбрасывает любые возвращенные байты для потока.
  4. Внешнее хранилище, соответствующее потоку, должно оставаться неизменным.
  5. Успешный вызов ungetc () очищает индикатор конца файла для потока.
  6. Значение индикатора позиции файла для потока после чтения или отбрасывания всех возвращенных байтов должно быть таким же, каким оно было до того, как байты были отправлены обратно.
  7. Индикатор позиции в файле уменьшается при каждом успешном вызове ungetc (), если его значение было 0 до вызова, его значение не указывается после вызова.

Программы ниже иллюстрируют вышеуказанную функцию.

Программа 1:

#include <stdio.h>
int main()
{
FILE * f;
int char ;
char buffer[256];
// read a file
f = fopen ( "use1.txt" , "r" );
// when no data
if (f == NULL) {
printf ( "Error in opening file" );
return (-1);
}
// read lines till end
while (! feof (f)) {
// get line
char = getc (f);
// replace ! with +
if ( char == '!' ) {
ungetc ( '+' , f);
}
// if not
else {
ungetc (c, f);
}
fgets (buffer, 255, f);
fputs (buffer, stdout);
}
return 0;
}

Предположим, у нас есть текстовый файл use1.txt, который содержит следующие данные. Этот файл будет использоваться в качестве входных данных для нашей примерной программы, а затем входные и выходные данные показаны ниже:

Вход:! C стандартная библиотека
       ! библиотечная функция stdio.h-ungetc ()
Вывод: + c стандартная библиотека
        + библиотечная функция stdio.h-ungetc ()

Программа 2:

// C program for taking input till we
// get 1 at the input
#include <stdio.h>
int main()
{
int ch;
// reads characters from the stdin and show
// them on stdout until encounters '1'
while ((ch = getchar ()) != '1' )
putchar (ch);
// ungetc() returns '1' previously
// read back to stdin
ungetc (ch, stdin);
// getchar() attempts to read
// next character from stdin
// and reads character '1' returned
// back to the stdin by ungetc()
ch = getchar ();
// putchar() displays character
putchar (ch);
return 0;
}
Хотите учиться на лучших видео и практических задачах, ознакомьтесь с Базовым курсом C для базового и продвинутого C.
C++ C