Если вы получаете это сообщение во время сохранения или компиляции сборки, просто закройте все файлы, а затем откройте любой файл для компиляции и сохранения.
Для меня причина в том, что я переименовал файл, и старый файл все еще был открыт.
Используйте массив std::wstring
вместо массива переменной длины C99. Текущий стандарт гарантирует непрерывный буфер для std::basic_string
. Например,
std::wstring wc( cSize, L'#' );
mbstowcs( &wc[0], c, cSize );
C ++ не поддерживает массивы переменной длины C99, поэтому, если вы скомпилировали свой код как чистый C ++, он даже не компилируется.
Сменив эту функцию
Не забудьте установить соответствующий язык в main
.
Например, setlocale( LC_ALL, "" )
.
Cheers & amp; HTH.,
В вашем примере wc
- это локальная переменная, которая будет освобождена при завершении вызова функции. Это ставит вас в неопределенную область поведения.
Простое исправление:
const wchar_t *GetWC(const char *c)
{
const size_t cSize = strlen(c)+1;
wchar_t* wc = new wchar_t[cSize];
mbstowcs (wc, c, cSize);
return wc;
}
Обратите внимание, что вызывающий код должен будет освободить эту память, иначе у вас будет память протечь.
Ваша проблема не имеет ничего общего с кодировками, это простой вопрос понимания базового C ++. Вы возвращаете указатель на локальную переменную из вашей функции, которая выйдет за пределы области действия к тому моменту, когда кто-либо сможет ее использовать, создав неопределенное поведение (т.е. программирование ошибка).
Следуйте этому Золотому правилу: «Если вы используете указатели на голые символы, вы делаете это неправильно. (За исключением случаев, когда вы этого не делаете.)«
I 've ранее опубликовал некоторый код для преобразования и передачи информации и ввода в объекты C ++ std::string
и std::wstring
.
Я сделал что-то вроде этого. Первые 2 нули - это потому, что я не знаю, какие вещи типа ascii эта команда хочет от меня. Общее чувство, которое у меня было, - создать массив temp char. пройти в широком массиве символов. бум. оно работает. +1 гарантирует, что нулевой завершающий символ находится в нужном месте.
char tempFilePath[MAX_PATH] = "I want to convert this to wide chars";
int len = strlen(tempFilePath);
// Converts the path to wide characters
int needed = MultiByteToWideChar(0, 0, tempFilePath, len + 1, strDestPath, len + 1);
Вы возвращаете адрес локальной переменной, выделенной в стеке. Когда ваша функция вернется, хранилище для всех локальных переменных (например, wc
) освобождается и может быть немедленно перезаписано чем-то другим.
Чтобы исправить это, вы можете передать размер буфера на GetWC
, но тогда у вас есть тот же интерфейс, что и mbstowcs
. Или вы могли бы выделить новый буфер внутри GetWC
и вернуть указатель на него, оставив его вызывающему, чтобы освободить буфер.
const char* text_char = "example of mbstowcs";
size_t length = strlen(text_char );
Пример использования «mbstowcs»
std::wstring text_wchar(length, L'#');
//#pragma warning (disable : 4996)
// Or add to the preprocessor: _CRT_SECURE_NO_WARNINGS
mbstowcs(&text_wchar[0], text_char , length);
Пример использования «mbstowcs_s»
Microsoft предложите использовать «mbstowcs_s» вместо «mbstowcs».
Ссылки:
wchar_t text_wchar[30];
mbstowcs_s(&length, text_wchar, text_char, length);