Я пытаюсь использовать WriteFile
для записи простого текста в файле .TXT. Вот моя декларация:
// For WriteFile fuction
BOOL writeFile;
LPCVOID textToWrite = L"SakyLabs: Hello, MDE.";
DWORD numberOfBytes = (DWORD)wcslen(textToWrite);
DWORD numberOfBytesWritten;
numberOfBytes
был основан на примере Microsoft отсюда.
Далее функция WriteFile:
writeFile = WriteFile(createFile, textToWrite, numberOfBytes, &numberOfBytesWritten, NULL);
Я получаю createFile из предыдущего вызова CreateFileW
. Кроме того, я использую функции Unicode.
WriteFile
работает, но я получаю только эту часть текста, написанную в файле:
S a k y L a b s : H
Что я делаю не так?
Проблема в том, что вы создаете строку широких символов L"..."
. Каждый WCHAR
имеет длину два байта, потому что Windows использует UTF-16 для широких строк. wcslen
считает число WCHAR
s в нем, а не байты.
Либо умножьте длину строки на размер WCHAR
:
DWORD numberOfBytes = (DWORD)wcslen(textToWrite)*sizeof(WCHAR);
или используйте узкие строки символов (предпочтительно в кодировке UTF-8, если вы действительно используете не-ASCII):
LPCVOID textToWrite = "SakyLabs: Hello, MDE.";
DWORD numberOfBytes = (DWORD)strlen(textToWrite);
Спасибо! Пробовал менять кодировку в VS, не помогло. Это может быть моя вина. Однако способ умножения сработал.
Если вы записываете UTF-16 в файл .txt, вы должны написать спецификацию в начале, чтобы другие программы могли определить кодировку.
К вашему сведению, ни один пример кода не должен компилироваться, поскольку ни wcslen()
, ни strlen()
не принимают LPCVOID
в качестве входных данных. То, что WriteFile()
принимает LPCVOID
, не означает, что ваши переменные должны быть объявлены как LPCVOID
. Все типы указателей неявно преобразуются в LPCVOID
. Используйте правильные типы для переменных, например LP(C)STR
ака (const) char*
для узких строк и LP(C)WSTR
ака (const) wchar_t*
для широких строк.
@RemyLebeau C допускает неявное преобразование в/из void*. Хотя я согласен с вами в том, что не следует использовать void*
в этом коде только потому, что это делает WriteFile
, я предпочитаю ограничивать свои ответы по объему с минимальными изменениями в коде OP.
@YakovGalka упс, мой плохой, я не увидела тег c , подумала, что это вопрос c++.
wcslen
не возвращает количество байтов...