`fputwc`, `putwc` 함수

fputwc, putwc 함수 (fputwc, putwc)

넓은 문자(wide character)를 파일에 써야 할 때 사용하는 함수가 fputwc예요. fputc의 넓은 문자 버전이죠. 다국어 문자, 이모지 같은 것까지 wchar_t 단위로 출력할 수 있어요. putwc는 매크로로 구현될 수 있는 짝 함수예요.

출처: cppreference

본문

함수 원형

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

wint_t fputwc( wchar_t ch, FILE* stream );   // (1)  (since C95)
wint_t putwc ( wchar_t ch, FILE* stream );   // (2)  (since C95)

설명 (Explanation)

  1. 넓은 문자 ch를 주어진 출력 스트림 stream에 써요.
  2. fputwc와 같지만, putwc가 매크로로 구현되어 있다면 stream을 두 번 이상 평가할 수 있어요.

매개변수 (Parameters)

  • ch — 쓸 넓은 문자
  • stream — 출력 스트림

반환값 (Return value)

성공하면 ch의 복사본을 돌려줘요.

실패하면 WEOF를 돌려주고 stream에 오류 표시를 설정해요(ferror() 참고). 인코딩 오류가 발생했다면 추가로 errnoEILSEQ로 설정해요.

예제 (Example)

UTF-8 로케일을 설정하고 이모지 하나를 stdout에 쓰는 예시예요. 실패하면 WEOF인지, 그것이 인코딩 오류인지 일반 I/O 오류인지 구분해 보여 줘요.

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

int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    errno = 0;
    if (fputwc(L'🍌', stdout) == WEOF)
    {
        if (errno == EILSEQ)
            puts("Encoding error in fputwc.");
        else
            puts("I/O error in fputwc.");
        return EXIT_FAILURE;
    }
}

가능한 출력:

🍌

여기서도 로케일 설정이 핵심이에요. 넓은 문자를 출력할 때는 현재 로케일의 인코딩으로 변환되기 때문에, 로케일을 제대로 설정해 주지 않으면 의도한 대로 안 나올 수 있어요.

같이 보기 (See also)

  • fputc/putc — 파일 스트림에 문자 쓰기
  • fputws — 파일 스트림에 넓은 문자열 쓰기
  • fgetwc/getwc — 파일 스트림에서 넓은 문자 가져오기