Jochen Arndt
Помимо использования правильной длины, то, что записывается в файл, также зависит от того, является ли ваш проект Unicode или нет.
Правильное решение для написания CString
содержание "как оно есть" есть:
fwrite(data.GetString(), sizeof(TCHAR), data.GetLength(), stream);
С Unicode строит,
CString
содержимое хранится внутри системы в виде
wchar_t
который имеет размер в два байта. При сборках, отличных от Unicode, он хранится как
char
. Этот
TCHAR
type - это соответствующий тип символов в соответствии с настройкой Unicode. Потому что
CString::GetLength()
возвращает количество символов, размер которых должен быть умножен на размер символа.
Если у вас есть сборка Unicode, но вы хотите записать ее в файл ANSI, вы должны сначала преобразовать строку в ANSI или использовать строку ANSI:
// Using ANSI string
CStringA dataA = "[ERROR]: 2018-03-21 06:51:02 GMT";
fwrite(dataA.GetString(), 1, dataA.GetLength(), stream);
// Writing ANSI with any build option
CString dataAny = _T("[ERROR]: 2018-03-21 06:51:02 GMT");
// This converts to ANSI with Unicode builds and copies otherwise
CStringA dataA(dataAny);
fwrite(dataA.GetString(), 1, dataA.GetLength(), stream);
Обратите внимание на использование
CStringA
что же это такое
char
версия.