2016-05-31 9 views
0

wchar_t 문자열을 WriteFile()을 사용하여 파일에 쓰려고합니다. 여기 코드는 다음과 같습니다wchar_t 문자를 파일에 쓰는 데 WriteFile()을 사용할 수 있습니까?

void main() 
{ 
    wchar_t dataString[1024]; 

    HANDLE hEvent, hFile; 
    DWORD dwBytesWritten, dwBytesToWrite; 

    hFile = CreateFileW(L"e:\\test.txt", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

    if(hFile == INVALID_HANDLE_VALUE) 
    { 
    printf("Invalid file handle: %d\n", GetLastError()); 
    return; 
    } 

    wcscpy(dataString, L"Hello"); 
    dwBytesToWrite = wcslen(dataString); 
    WriteFile(hFile, (LPVOID)dataString, dwBytesToWrite, &dwBytesWritten, NULL); 

    CloseHandle(hFile); 

} 

내가 문자열 Hello 파일에 기록 할 것으로 예상된다. 그러나 파일 내부의 출력은 다음과 같다 :

H e l 

이 파일에 전체 문자열 Hello를 작성되지 않는 이유 어떤 생각?

답변

0
dwBytesToWrite = wcslen(dataString); 

바이트 수는 문자 수를 반환하지 않습니다. 와이드 문자 (문자 당 2 바이트)를 사용할 때, 그 중 일부만이 파일에 기록됩니다.

대신을 시도해보십시오

dwBytesToWrite = wcslen(dataString) * sizeof(wchar_t); 
+0

예, 성공했습니다. 고맙습니다 – Neena

0
  1. 추가 바이트 순서 마크 (참조 : https://en.wikipedia.org/wiki/Byte_order_mark)(UTF-8(0xEF,0xBB,0xBF))를 텍스트 파일
  2. 의 시작에에 문자열을 변환 UTF-8 인코딩 (https://en.wikipedia.org/wiki/UTF-8를)
.

다음을 시도하십시오.

/////////////   
{ 
unsigned char utf8BOM[3]={0xef,0xbb,0xbf}; 
unsigned int i=0; 
DWORD bytesWrote; 
unsigned int stringLen=wcslen(dataString); 
WriteFile(hFile,utf8BOM,3,&bytesWrote,0); 
unsigned int i=0; 
while(i< stringLen){ 

    unsigned char buf3[3]; 
    if(((unsigned short)dataString[i])>0x7FF){ 
     buf3[0]=(0xe0 | (0x0F & (dataString[i]>>12))); 
     buf3[1]=(0x80 | (0x03F & (dataString[i]>>6))); 
     buf3[2]=(0x80 | (0x03F & (dataString[i]))); 
     WriteFile(hFile,buf3,3,&bytesWrote,0); 
    } 
    else{ 
     if(((unsigned short)dataString[i]) > 0x7F){ 
      buf3[0]=((dataString[i]>>6)&0x03) | 0xC0; 
      buf3[1]=(dataString[i] & 0x3F) | 0x80; 
      WriteFile(hFile,buf3,2,&bytesWrote,0); 
     } 
     else{ 
      buf3[0]=dataString[i]; 
      WriteFile(hFile,buf3,1,&bytesWrote,0); 
     } 
    } 

    i++; 
} 
} 
////////////////////