`fgetwc`, `getwc` 함수

fgetwc, getwc 함수 (fgetwc, getwc)

좁은 문자(바이트)를 읽는 fgetc가 있다면, 넓은 문자(wide character)를 읽는 버전도 있어요. 그게 fgetwc예요. wchar_t 단위로 다국어 문자를 처리할 때 쓰고, getwcgetc처럼 매크로로 구현될 수 있는 짝 함수입니다.

출처: cppreference

본문

함수 원형

<wchar.h>에 정의돼 있어요. (C95부터)

wint_t fgetwc( FILE* stream );   // (1)  (since C95)
wint_t getwc ( FILE* stream );   // (2)  (since C95)

설명 (Explanation)

  1. 주어진 입력 스트림에서 다음 넓은 문자를 읽어요.
  2. fgetwc와 같지만, getwc가 매크로로 구현되어 있다면 stream을 두 번 이상 평가할 수 있어요.

매개변수 (Parameters)

  • stream — 넓은 문자를 읽어올 스트림

반환값 (Return value)

스트림에서 읽은 다음 넓은 문자를 돌려주고, 실패하면 WEOF를 돌려줘요.

실패 원인이 파일 끝 조건이라면 stream에 eof 표시를 설정하고(feof() 참고), 다른 오류라면 오류 표시를 설정해요(ferror() 참고). 인코딩 오류가 발생했다면 추가로 errnoEILSEQ로 설정해요.

예제 (Example)

UTF-8 로케일을 설정하고, 파일에 쓴 러시아어 문자열을 넓은 문자로 하나씩 읽어 다시 출력하는 예시예요. 인코딩 오류인지 일반 I/O 오류인지를 errno == EILSEQ로 구분해요.

#include <errno.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>

int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");

    FILE* fp = fopen("fgetwc.dat", "w");
    if(!fp)
    {
        perror("Can't open file for writing");
        return EXIT_FAILURE;
    }
    fputs("кот\n", fp);
    fclose(fp);

    fp = fopen("fgetwc.dat", "r");
    if (!fp)
    {
        perror("Can't open file for reading");
        return EXIT_FAILURE;
    }

    wint_t wc;
    errno = 0;
    while ((wc = fgetwc(fp)) != WEOF)
        putwchar(wc);

    if (ferror(fp))
    {
        if (errno == EILSEQ)
            puts("Character encoding error while reading.");
        else
            puts("I/O error when reading");
    }
    else if (feof(fp))
        puts("End of file reached successfully");

    fclose(fp);
}

가능한 출력:

кот

넓은 문자 입출력은 로케일에 따라 인코딩 변환이 일어나므로, 읽기 전에 로케일을 설정하는 일이 빠지면 안 돼요.

같이 보기 (See also)

  • fgetc/getc — 파일 스트림에서 문자 가져오기
  • fgetws — 파일 스트림에서 넓은 문자열 가져오기
  • fputwc/putwc — 파일 스트림에 넓은 문자 쓰기
  • ungetwc — 넓은 문자를 파일 스트림에 되돌려 놓기