2013-07-05 2 views
1

Работа с этими безумными строк и массивов дает мне головную боль ...Соединить два wchar_t массивы в C++

Вот мой код до сих пор

wchar_t mypath[MAX_PATH]; 
wchar_t temppath[MAX_PATH]; 

GetModuleFileName(0, mypath, MAX_PATH); 
GetTempPath(MAX_PATH, temppath); 
CreateDirectory(???, NULL); 

Первые два окна функции API использовать переменную LPWSTR , Третий использует LPCWSTR. В чем главное отличие? После того, как я получу путь для каталога TEMP, я хочу создать в нем новый каталог под названием «test». Это означает, что мне нужно добавить (L "test") к переменной "temppath". Может кто-нибудь дать мне несколько советов о том, как использовать эти массивы. Это то, что делает C++ болью. Почему бы не все просто установить один тип данных для строк. Как wchar_t даже полезен? Его так трудно использовать и манипулировать.

Спасибо, ребята!

+2

Интерфейс Win32 API поддерживает C, который не имеет хорошие классы-оболочки, как 'станд :: wstring' в C++. Но поскольку вы используете C++, вы можете использовать 'std :: wstring' для вашей конкатенации. –

+1

* Это то, что делает C++ болью. * Нет, это не так. Это то, что делает C болью. – chris

+0

Я предполагаю, что вы правы @chris –

ответ

4

Использование PathCombine(), например:

wchar_t temppath[MAX_PATH+1] = {0}; 
GetTempPath(MAX_PATH, temppath); 

wchar_t mypath[MAX_PATH+8] = {0}; 
PathCombineW(mypath, temppath, L"test"); 

CreateDirectoryW(mypath, NULL); 
5

В первых двух функциях API окна используется переменная LPWSTR. Третий использует LPCWSTR. В чем главное отличие?

LPCWSTR является const версия LPWSTR:

  • От LPCWSTR:

    typedef const wchar_t* LPCWSTR; 
    
  • От LPWSTR:

    typedef wchar_t* LPWSTR, *PWSTR; 
    

Я хочу создать в нем новый каталог под названием «test». Это означает, что мне нужно добавить (L "test") к переменной "temppath".

Используйте std::wostringstream:

std::wostringstream wos; 
wos << temppath << L"\\test"; 
std::wstring fullpath(wos.str()); 

или просто std::wstring (как это было предложено Крисом в комментариях):

std::wstring fullpath(std::wstring(temppath) + L"\\test"); 

производить каскадный версию. Затем используйте c_str() в качестве аргумента CreateDirectory():

if (CreateDirectory(fullpath.c_str(), NULL) || 
    ERROR_ALREADY_EXISTS == GetLastError()) 
{ 
    // Directory created or already existed. 
} 
else 
{ 
    // Failed to create directory. 
} 
+0

Не будет 'std :: wstring (temppath) + L" \\ test "' быть проще (даже лучше, если используется 'std :: wstring')? – chris

+0

@chris, да и обновится. – hmjd

+0

@hmjd отличный ответ! Я принял другой, хотя, потому что это было проще, но я все еще это сделал! –

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