본문 바로가기

쓰기

텍스트파일을

특정 인코딩에 따라서 읽거나 쓰는 라이브러리 되겠습니다.

#define MBCS                    0
#define UTF16LE_BOM        2
#define UTF16LE_NOBOM    3
#define UTF16BE_BOM        4
#define UTF16BE_NOBOM    5
#define UTF8_BOM                6
#define UTF8_NOBOM            7

LPWSTR FileOpen(LPCWSTR cszFilePath,int nUnicode=UTF16LE_BOM,int nEncoding=CP_UTF8);
LPWSTR FileOpen(LPCWSTR cszFilePath,vector<wstring>* arText,
                             int nUnicode=UTF16LE_BOM,int nEncoding=CP_UTF8);

void FileSave(LPCWSTR cszFilePath,LPCWSTR pszText,
                      int nUnicode=UTF16LE_BOM,int nEncoding=CP_UTF8);
void FileSave(LPCWSTR cszFilePath,vector<wstring>* arText,
                       int nUnicode=UTF16LE_BOM,int nEncoding=CP_UTF8);

파일에 BOM이 설정되어 있는 경우에는
nUnicode값에 상관없이 (MBCS일지라도!)
BOM에 맞는 값을 읽어옵니다.

vector를 이용한 함수를 사용할 경우
'줄 단위'로 잘라져서 들어갑니다.

사용법
LPWSTR pszText = FileOpen(L"Temp.txt",UTF8_NOBOM);

vector arText<wstring>;
FileOpen(L"Temp.txt",&arText,MBCS,932);

arText.push_back(L"내용 추가");
arText.push_back(L"줄 추가");


FileSave(L"Out.txt",pszText);

FileSave(L"Out2.txt",&arText,UTF16BE_BOM);

참고1.
FileOpen할때 인코딩 지정은
BOM이 없는 파일을 기준으로 해주는것이 좋습니다.

예를 들자면
'UTF16LE_NOBOM'
'MBCS,949'

참고2.
FileOpen에서 vector를 사용하는 함수값의
반환값이 LPWSTR이긴 하지만,
이 경우에는 무조건 NULL이 반환됩니다.
오버로딩 때문에 적용된 '꼼수'일 뿐이니 실수하지 않도록 해주세요 ^^;

참고3.
Visual Studio 2005에서 작성하였지만
라이브러리 파일 자체는 어느 버전에서든 잘 작동할거라고 봅니다
조회 수 :
11830
등록일 :
2009.02.01
02:55:25
엮인글 :
https://arallab.hided.net/4257/a0f/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/4257

마이아크

2009.02.01
03:00:13
수고하셨어요~~~~~~

HaruKaze

2009.02.01
12:37:54
감사합니다. 잘 사용하겠습니다...(_ _)

호기심맨

2009.02.01
19:59:37
이야 진짜 편하겠는데요 잘 쓰겠습니다.~

HaruKaze

2009.02.08
17:58:08
유니코드 파일을 오픈 할 경우 라인이 한줄씩 더 생기는 문제가 발생하네요..ㅠ.ㅠ

그리고 건의드리고 싶은게 nUnicode를 인자로 주고 받을것이 아니라 코드페이지를 참조해서 수행하면 좋을것 같아요. 단 유니코드일 경우에는 반드시 BOM 첨가로...

저장쪽은 일단 난잡하게 수정해서 해결은 했는데 오픈쪽은 손을 못대겠어요...ㄷㄷ

일단 수정한 부분은 다음...

 void FileSave(LPCWSTR cszFilePath,LPCWSTR pszText,int nEncoding)
{
    HANDLE hFile=NULL;
    char * arText=NULL;
    DWORD nDestSize=0;
    try
    {
        hFile = CreateFile(cszFilePath,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        if(hFile==NULL)
            throw 1;

        //메모리 생성
        DWORD nSrcSize=lstrlenW(pszText);
        arText = new char[nSrcSize*3+100]; //닥치고 3배
        memset(arText,0x00,nSrcSize*3+100);

        /* nUnicode
        0: MBCS
        2: UTF-16LE BOM
        4: UTF-16BE BOM
        6: UTF-8 BOM
        (2,4,6 +1 : NO-BOM)
        */
        
        int nSrc=0;
        bool bCross0=0;
        bool bCross1=1;
        bool bLE=false;
        bool bBOM=false;
        //int nUnicode=0;
        
        switch(nEncoding)
        {
        case 1200:
            //UTF-16LE BOM
            bLE=true;
        case 1201:
            //UTF-16BE BOM
            bBOM=true;
        //case 3:
        //    //UTF-16LE
        //    if(nUnicode==3)
        //        bLE=true;
        //case 5:
        
            //UTF-16BE

            //작업 개시

            //바이트 크로스작업
            if(!bLE)
            {
                bCross0=1;
                bCross1=0;
            }

            //BOM삽입
            if(bBOM)
            {
                dByte.wc=(DWORD)0xFEFF;
                arText[nDestSize++]=(char)dByte.sc[bCross0];
                arText[nDestSize++]=(char)dByte.sc[bCross1];
            }

            while(pszText[nSrc]!=L'')
            {
                if(pszText[nSrc]==L'r')
                {
                    dByte.wc=L'r';
                    arText[nDestSize++]=(char)dByte.sc[bCross0];
                    arText[nDestSize++]=(char)dByte.sc[bCross1];

                    dByte.wc=L'n';
                    arText[nDestSize++]=(char)dByte.sc[bCross0];
                    arText[nDestSize++]=(char)dByte.sc[bCross1];
                }
                else if(pszText[nSrc]==L'n')
                {
                    
                }
                else
                {
                    dByte.wc=pszText[nSrc];
                    arText[nDestSize++]=(char)dByte.sc[bCross0];
                    arText[nDestSize++]=(char)dByte.sc[bCross1];
                }
                nSrc++;
            }

            break;

        case 65001:
            //UTF-8 BOM
            nEncoding=CP_UTF8;
            arText[nDestSize++]=(char)0xEF;
            arText[nDestSize++]=(char)0xBB;
            arText[nDestSize++]=(char)0xBF;
            bBOM=true;
        
        default:
            //MBCS or Default UTF-8 (NO BOM)
            //nUnicode=0;
            DWORD dByte=nSrcSize*3+100;
            if(bBOM)
                nDestSize=WideCharToMultiByte(nEncoding,0,pszText,-1,arText+3,dByte-3,0,0)+3;
            else
                nDestSize=WideCharToMultiByte(nEncoding,0,pszText,-1,arText,dByte,0,0);
            
            /////////  Modified by Haru 2009-02-08 /////////
            //
            strcmp(arText,(LPSTR) pszText);        // Added
            
            // Removed
            //int nRet=0;

            //for(DWORD i=0;i<nDestSize;i++)
            //{
            //    if(arText[i]=='n')
            //    {
            //        nRet++;
            //    }
            //}

            //nDestSize+=nRet;

            //for(int i=nDestSize-1-nRet;i>=0;i--)
            //{
            //    if(arText[i]=='n')
            //    {
            //        arText[i+nRet--]='n';
            //        arText[i+nRet]='r';
            //    }
            //    else
            //    {
            //        if(nRet==0)
            //            break;

            //        arText[i+nRet]=arText[i];
            //    }
            //}
            /////////////////////////////////////////

            break;
        }
        if(nEncoding!=1200 && nEncoding!=1201 && nEncoding!=65001)
            nDestSize--;
        WriteFile(hFile,arText,nDestSize,&nDestSize,0);

        delete[]arText;
        CloseHandle(hFile);

    }
    catch (int nErr)
    {
        delete[]arText;
        CloseHandle(hFile);
    }
}


Hide_D

2009.02.09
00:37:47
Visual C++ 전용으로 만들어졌습니다[...]
VB와 연동하는경우에는 어떻게 되는지 저도 잘 모릅니다 -_-;
List of Articles
번호 제목 글쓴이 조회 수 추천 수sort 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155439   2008-08-03 2008-12-16 00:03
85 Archive [번역툴]QuickTrans 0.1.0 릴리즈 [1] file HaruKaze 17466   2009-03-08 2011-06-28 01:25
 
84 Archive FixLine v2 20090329 테스트버전 [6] file Hide_D 14317   2009-03-29 2009-03-29 15:51
 
83 Archive FixLine v2 20090331 테스트버전 [2] file Hide_D 14494   2009-03-31 2009-04-01 14:52
 
82 Archive FixLine v2 20090402 테스트버전 [1] file Hide_D 14431   2009-04-02 2009-04-02 09:03
 
81 Archive FixLine v2 20090404 [....] [1] file Hide_D 14767   2009-04-04 2009-04-04 19:10
 
80 Archive FixLine v2 20090404_2 RC2 [2] file Hide_D 16439   2009-04-04 2009-04-05 03:47
 
79 Archive [번역툴] QuickTrans 0.1.1 [4] HaruKaze 14339   2009-05-04 2009-05-05 22:28
몇가지 버그와 자동 저장기능을 추가한 0.1.1 버전입니다. 다운로드 -- Version History -- 0.1.1 Release 2009-05-04 18:00 - 명령어 예외 목록의 수정 기능이 정상적으로 작동되지 않는 버그 수정 - 프로그램이 비정상적으로 종료될 만한 옵션을 변경할 경우...  
78 Archive KDC(Korean Duplication Checker) 090702 테스트버전 [2] file Hide_D 16974   2009-07-07 2009-07-08 02:43
 
77 Archive [플러그인, 소스] NonCached 테스트 버전 20090709 [3] file whoami 27839   2009-07-09 2009-07-11 01:51
 
76 Archive [플러그인, 소스] NonCached 테스트 버전 20090717 [1] file whoami 17949   2009-07-17 2009-07-23 23:37
 
75 Archive [플러그인, 소스] KiriKiri 테스트 버전 20090723 [1] file whoami 17854   2009-07-23 2009-07-23 23:38
 
74 Archive [플러그인, 소스] KiriKiri 테스트 버전 20090726 [10] file whoami 24511   2009-07-26 2009-07-28 23:52
 
73 Archive [플러그인,소스] KiriKiri 테스트 버전 20090729 [11] file whoami 21238   2009-07-29 2009-09-13 14:57
 
72 Archive ATPluginFrame 프레임워크 20090901 테스트 버전.. file whoami 12897   2009-09-01 2009-09-01 22:49
 
71 Archive [소스] ATPluginFrame 프레임워크 20091220 테스트 버전 [2] file whoami 11847   2009-12-20 2009-12-22 15:56
 
70 Archive [소스] ATPluginFrame 프레임워크 20091222 테스트 버전 [1] file whoami 17551   2009-12-22 2009-12-30 18:58
 
69 Archive [소스] ATPluginFrame 프레임워크 20100105 테스트 버전 file whoami 17914   2010-01-05 2010-01-05 19:47
 
68 Archive [플러그인] GoogleTrans 테스트 버전 (20100620) file Hide_D 26601   2010-06-20 2010-06-20 16:00
 
67 Archive [소스, 플러그인] Cache 테스트버전 101127 file Hide_D 19949   2010-11-27 2010-11-27 04:19
 
66 Archive [소스] CustomDic v4 20110102 테스트버전 [1] file Hide_D 17513   2011-01-02 2011-01-03 06:08