정리

[Win32] CreateFile로 Text파일을 처리할 때

저장소/VC++

Text 파일을 처리할 때 Unicode 문자열을 그냥 저장하고 싶을 때
CreateFile/WriteFile을 이용하여 그냥 마구마구 써버리면?
하아... 이게 왜이러지? 하는 생각이 마구마구 들 것이야. ㅋㅋ
또 까묵지 말고 기억해두자.

일단 Byte Order Mark(BOM)에 대해서 알아두자.
추가로 fopen의 대해서 알아두는 것도 도움이 될 것 같다.

CreateFile API에 대한 내용은 MSDN을 참고하자.
아래 내용과 관련된 이슈도 있으니까 참고하자.
(읽어보니 Windows NT 서버쪽에서 UNC 경로를 이용하여 처리할 때 벌어지는 문제라고 함.)

내용을 다 살펴봤으면 본론을 얘기하도록 하자.
fopen과 같이 ccs= 옵션이 없기 때문에 파일을 처음 생성할 때
BOM을 지정해줘야 원하는 인코딩 형식의 Text 파일을 만들 수 있다.

CreateFile을 사용할 때 flag를 OPEN_ALWAYS로 지정하면
파일이 없을 경우 파일을 새로 생성한다.
GetLastError 함수로 에러값을 확인해보면 파일이 새로 생성된 경우엔
0이 반환되지만 파일이 이미 있는 경우에는 ERROR_ALREADY_EXISTS(183L)이 반환된다.
이 내용은 MSDN에 있으니까 다시 확인해보자.
자... 어쨌든 이 방법을 이용하여 새로 생성됐는지의 여부를 판단하는 것이다.
새로 생성? 이 때가 기회다!!
원하는 인코딩 형식의 정보를 넣어주자.
예를들어 Unicode 프로젝트에서 Unicode 문자열을 그대로 넣고 싶다면
0xFF, 0xFE를 차례대로 Write해주자.

다른 인코딩도 BOM 정보를 확인하여 처리하면 된다.
만약 ANSI 인코딩을 원한다면 물론 문자열을 Multibyte로 변환해야 한다.
그런거다. 이게 전부다. 딴거 없다. 훗... 역시 기록을 해두면 나중에 편하다니까. ㅋㅋㅋ

'저장소 > VC++' 카테고리의 다른 글

[Win32 API] GetSystemTime과 GetLocalTime  (0) 2010.05.22
[C++] __stdcall, __cdecl 그리고 Calling Convention  (0) 2010.02.17
[Error/Warning] warning C4995  (0) 2009.09.23
[Win32] GetFileAttributes  (0) 2009.09.22
[C++] Calling Convention  (0) 2009.09.22