2016-05-31 3 views
0

Я пытаюсь написать строку типа wchar_t в файл с помощью WriteFile(). Вот код:Может ли WriteFile() использоваться для записи символов wchar_t в файл?

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++; 
} 
} 
//////////////////// 

 Смежные вопросы

  • Нет связанных вопросов^_^