`fgetwc`, `getwc` 함수
fgetwc, getwc 함수 (fgetwc, getwc)
좁은 문자(바이트)를 읽는 fgetc가 있다면, 넓은 문자(wide character)를 읽는 버전도 있어요. 그게 fgetwc예요. wchar_t 단위로 다국어 문자를 처리할 때 쓰고, getwc는 getc처럼 매크로로 구현될 수 있는 짝 함수입니다.
출처: cppreference
본문
함수 원형
<wchar.h>에 정의돼 있어요. (C95부터)
wint_t fgetwc( FILE* stream ); // (1) (since C95)
wint_t getwc ( FILE* stream ); // (2) (since C95)
설명 (Explanation)
- 주어진 입력 스트림에서 다음 넓은 문자를 읽어요.
fgetwc와 같지만,getwc가 매크로로 구현되어 있다면stream을 두 번 이상 평가할 수 있어요.
매개변수 (Parameters)
stream— 넓은 문자를 읽어올 스트림
반환값 (Return value)
스트림에서 읽은 다음 넓은 문자를 돌려주고, 실패하면 WEOF를 돌려줘요.
실패 원인이 파일 끝 조건이라면 stream에 eof 표시를 설정하고(feof() 참고), 다른 오류라면 오류 표시를 설정해요(ferror() 참고). 인코딩 오류가 발생했다면 추가로 errno를 EILSEQ로 설정해요.
예제 (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— 넓은 문자를 파일 스트림에 되돌려 놓기