Monday, 15 April 2013

c++ - wcscpy_s not affecting wchar_t* -



c++ - wcscpy_s not affecting wchar_t* -

i'm trying load strings database struct, maintain running odd issue. using struct datum,

struct datum { wchar_t* name; wchar_t* lore; };

i tried next code snippet

datum thisdatum; size_t len = 0; wchar_t wbuffer[2048]; mbstowcs_s(&len, wbuffer, (const char*)sqlite3_column_text(pstmt, 1), 2048); if (len) { thisdatum.name = new wchar_t[len + 1]; wcscpy_s(thisdatum.name, len + 1, wbuffer); } else thisdatum.name = 0; mbstowcs_s(&len, wbuffer, (const char*)sqlite3_column_text(pstmt, 2), 2048); if (len) { thisdatum.lore = new wchar_t[len + 1]; wcscpy_s(thisdatum.lore, len + 1, wbuffer); } else thisdatum.name = 0;

however, while thisdatum.name copies correctly, thisdatum.lore garbage, except on 2 occassions. if project debug, fine, isn't option. discovered rewriting struct datum

struct datum { wchar_t* lore; wchar_t* name; };

completely fixes issue thisdatum.lore, gives me garbage thisdatum.name.

try more this:

struct datum { wchar_t* name; wchar_t* lore; };

wchar_t* widen(const char *str) { wchar_t *wbuffer = null; size_t len = strlen(str) + 1; size_t wlen = 0; mbstowcs_s(&wlen, null, 0, str, len); if (wlen) { wbuffer = new wchar_t[wlen]; mbstowcs_s(null, wbuffer, wlen, str, len); } homecoming wbuffer; }

datum thisdatum; thisdatum.name = widen((const char*)sqlite3_column_text(pstmt, 1)); thisdatum.lore = widen((const char*)sqlite3_column_text(pstmt, 2)); ... delete[] thisdatum.name; delete[] thisdatum.lore;

that beingness said, utilize std::wstring instead:

struct datum { std::wstring name; std::wstring lore; };

#include <locale> #include <codecvt> std::wstring widen(const char *str) { std::wstring_convert< std::codecvt<wchar_t, char, std::mbstate_t> > conv; homecoming conv.from_bytes(str); }

datum thisdatum; thisdatum.name = widen((const char*)sqlite3_column_text(pstmt, 1)); thisdatum.lore = widen((const char*)sqlite3_column_text(pstmt, 2));

c++ struct wchar-t

No comments:

Post a Comment