훈, IT 공부/C,C++,MFC

[궁금점]winApi WriteFile 함수의 동작

IT훈이 2018. 6. 2.
반응형

WriteFile

 

윈도우 API WriteFile

BOOL WriteFile(                         // 반환값 : 성공이면 TRUE
        HANDLE hFile,                   // 파일 핸들
        LPCVOID lpBuffer,               // 기록할 데이터가 저장된 버퍼
        DWORD nNumberOfBytesToWrite,    // 기록할 최대 바이트수
        LPDWORD lpNumberOfBytesWritten, // 실제로 기록한 바이트 수를 받을 변수의 주소
        LPOVERLAPPED lpOverlapped       // OVERLAPPED 구조체 주소
);
WriteFile은 윈도우 환경에서 파일에 출력할때 사용된다.

 

실험 

WriteFile을 사용하던 중 신기한 경우를 찾아내어서 작성해본다. 파일의 인코딩이 변경된다?? 라는 것에 대한 의문점이다. 

인코딩

파일 인코딩 보는 방법은 메모장에서 [다른이름으로 저장] 탭을 눌러보면 확인 가능하다.

 

OS : Window10 

Tool : Visual Studio 2008 

개발환경 : 유니코드


# case 1 

    TCHAR *pszPath = _T(".\\Test_length.txt");
    HANDLE h = CreateFile(pszPath, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
 
    if( h != INVALID_HANDLE_VALUE)
    {
       
        DWORD dwLen = 0;    
        TCHAR *pszStr =_T("HELLO WORLD FUCK MAN!!!");
        WriteFile(h, pszStr, sizeof(wchar_t)*_tcslen(pszStr), &dwLen, 0);
        CloseHandle(h);
    }

- 파일 인코딩 : 텍스트파일 ANSI 일때 -> 텍스트파일 UNICODE로 변경

 - 문자 모두 출력 

 - 문자열의 크기 : 23 이지만 유니코드일때는 46

 

 

 

# case 2

    TCHAR *pszPath = _T(".\\Test_length.txt");
    HANDLE h = CreateFile(pszPath, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
 
    if( h != INVALID_HANDLE_VALUE)
    {

        DWORD dwLen = 0;    
        TCHAR *pszStr =_T("HELLO WORLD FUCK MAN!!!");
        WriteFile(h, pszStr, _tcslen(pszStr), &dwLen, 0);
 //WriteFile(h, pszStr, sizeof(char)*_tcslen(pszStr), &dwLen, 0); //같은의미
        CloseHandle(h);
    }

 - 파일 인코딩 : 텍스트파일 ANSI 일때 -> 텍스트파일 ANSI 유지

 - 문자열 ANSI유형으로 작성됨..

 - 문자열의 크기 : 23

 

 

 

 

알게된것

 

1. WriteFile을 사용할때, 세번째 인자의 값은 szieof로 타입을 명시해야한다.

2. 세번째 인자의 값이 무엇인지에 따라서 출력되는 결과물의 인코딩 타입이 결정된다.

3. 그래서 어디에서 적용할 것인가..???

- 텍스트 파일을 읽고 쓸때 컴파일러의 환경과 사용자의 환경이 다를때 적용해볼수 있다.

반응형

댓글