Namespaces
Variants

ungetc

From cppreference.net
< c ‎ | io
헤더 파일에 정의됨 <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 호출이 성공하면 스트림 위치 지시자가 1 감소합니다(스트림 위치 지시자가 0이었을 경우의 동작은 정의되지 않음).

텍스트 스트림에서 ungetc 를 성공적으로 호출하면 스트림 위치 지시자를 지정되지 않은 방식으로 수정하지만, 모든 밀어넣은(pushed-back) 문자가 읽기 연산으로 검색된 후에는 스트림 위치 지시자가 ungetc 호출 전의 값과 동일하다는 것을 보장합니다.

목차

매개변수

ch - 입력 스트림 버퍼에 푸시될 문자
stream - 문자를 되돌릴 파일 스트림

반환값

성공 시 ch 가 반환됩니다.

실패 시 EOF 가 반환되고 주어진 스트림은 변경되지 않은 상태로 유지됩니다.

참고 사항

푸시백 버퍼의 크기는 실제로 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 함수 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.21.7.10 ungetc 함수 (p: 243)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.21.7.10 ungetc 함수 (p: 334)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.19.7.11 The ungetc function (p: 300)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.9.7.11 ungetc 함수

참고 항목

파일 스트림에서 문자를 가져옴
(함수)