본문 바로가기

쓰기

텍스트파일을

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

#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/e55/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
번호 제목 글쓴이 조회 수 추천 수 날짜 최근 수정일
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155444   2008-08-03 2008-12-16 00:03
249 Talk AralTrans 필터 물갈이할 예정입니다.... [1] Hide_D 14727   2009-05-21 2009-05-22 01:55
일단 제가 방학을 시작하기도 했고 하니 아랄트랜스 내에서 제가 제작한 필터를 싹 물갈이해볼 생각입니다. 우선 물갈이 대상 CustomDic 0.4 KDC CustomScript v2 DumpText v2 FixLine v3 작업을 위해서 다음과 같은 라이브러리를 만들어서 걍 복붙 시전할 계...  
248 OtherFiles [프로그램, 소스] Windows Vista 7 볼륨 조절기 -_-; [1] file Hide_D 16877   2009-05-14 2009-05-16 00:05
 
247 Archive [번역툴] QuickTrans 0.1.1 [4] HaruKaze 14346   2009-05-04 2009-05-05 22:28
몇가지 버그와 자동 저장기능을 추가한 0.1.1 버전입니다. 다운로드 -- Version History -- 0.1.1 Release 2009-05-04 18:00 - 명령어 예외 목록의 수정 기능이 정상적으로 작동되지 않는 버그 수정 - 프로그램이 비정상적으로 종료될 만한 옵션을 변경할 경우...  
246 Archive FixLine v2 20090404_2 RC2 [2] file Hide_D 16439   2009-04-04 2009-04-05 03:47
 
245 Archive FixLine v2 20090404 [....] [1] file Hide_D 14767   2009-04-04 2009-04-04 19:10
 
244 Talk 참 오묘한 윈도우~ 호기 13568   2009-04-04 2009-04-04 01:02
실수로.... malloc으로 잡은걸 HeapFree 하고 있었네요... (머 정확히 말자면 HeapCreate로 새 힙영역 확보하고 할당 해제 하는걸 구축했습니다만.... 정작 할당부분에서 malloc을썼던거죠) 문제는 이렇게 잘못짠걸 1개월이나 지난후에 알았다는 겁니다. 즉 그...  
243 Talk 아나 ㅅㅂ VS2008 안쓸랍니다. [5] Hide_D 12867   2009-04-02 2009-04-03 21:16
제컴이 ㅄ인지 설치할때 ㅄ이 된건진 잘 모르겠는데, 쓰기 갑갑해 미치겠습니다ㅣ -_-; Visual Studio 2008 SP1입니다. 자주 발생하는 현상이 예를 들어 int j=0; for(int i=0;i<28;i++) { j+=i; } for(int i=0;i<28;i++) { j+=i; } _wsprintf(L"%d",j); 요런 ...  
242 Archive FixLine v2 20090402 테스트버전 [1] file Hide_D 14431   2009-04-02 2009-04-02 09:03
 
241 Archive FixLine v2 20090331 테스트버전 [2] file Hide_D 14494   2009-03-31 2009-04-01 14:52
 
240 Archive FixLine v2 20090329 테스트버전 [6] file Hide_D 14317   2009-03-29 2009-03-29 15:51
 
239 Talk FixLine '인수 추가' 창 새 디자인 [4] file Hide_D 18340   2009-03-26 2009-03-27 02:07
 
238 Talk 히데님이 부탁하신거.... [1] file 류제로 19459   2009-03-21 2011-06-28 01:25
 
237 Talk 번역 플러그인 난해한 문제???? [3] 호기 14864   2009-03-15 2009-10-20 18:06
지금 ML_Trans라는 번역 플러그인을 만들고 있는데 좀 이해가 안가는 문제가 생기네요.. 아랄에 적용시킨후 다른 번역 플러그인으로 바꿀때는 아무 문제가 안생깁니다 그러니까 번역 플러그인을 EzTransXp<->ML_Trans로 마구 여러번 바꾸어도 문제는 안일어 납...  
236 Talk FixLine 기능 추가 [1] Hide_D 11416   2009-03-13 2009-03-13 21:23
rn r 이런식으로 나올때 r이 우선 적용되는 문제를 해결할것 -가능한 방법- 1. Greedy, UnGreedy의 부분적 적용 2. 우선순위 선택 3. 정규식과 맞짱뜨기 4. 어정쩡한 조건문 (r)(n) 이면 둘중 하나 있거나, 둘다 있거나 하면 그렇게 지정되는걸로 - 류제로님의...  
235 Archive [번역툴]QuickTrans 0.1.0 릴리즈 [1] file HaruKaze 17467   2009-03-08 2011-06-28 01:25
 
234 Talk 버그 확인 목록 [4] Hide_D 12348   2009-03-06 2009-03-16 03:09
(확인) CustomDic - 옵션창에서 쓰레드를 중지하지 않았다. CustomScript - 파일이 없는 상태에서 바로가기에 Write 모드가 추가되었을때 에러 KiriKiri - 선택지 출현지 문자열 번역 오류 해결 (확인 필요) FixLine 문자가 아무도 없을때 튕김 -_-? 2Byte 잘 ...  
233 Archive [번역툴]QuickTrans 0.0.10 RC4 [10] file HaruKaze 11899   2009-02-09 2009-03-07 20:49
 
» Archive TextFile Open/Save Library [5] file Hide_D 11830   2009-02-01 2009-02-09 00:37
텍스트파일을 특정 인코딩에 따라서 읽거나 쓰는 라이브러리 되겠습니다. #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 c...  
231 Archive [번역툴]QuickTrans Beta 0.0.6 [6] file HaruKaze 21992   2009-01-28 2011-04-27 12:51
 
230 Talk 코드정리 목록 + 코드 secret sizukana 6   2009-01-17 2009-01-17 11:41
비밀글입니다.