FindFirstFile LPCSTR

Здравствуйте, у меня есть проблема с моим кодом здесь.

LPCSTR mergeString(LPCSTR firstString, std::string secondString)
{
string convertedString = ConvertString(firstString);
LPCSTR mergedString;
int i = convertedString.size();

convertedString.insert(i, secondString);
mergedString = (convertedString.c_str());

return mergedString;
}

void GetFiles(LPCSTR path)
{
WIN32_FIND_DATA File_Data;
LPCSTR lPath = mergeString(path,"\\*.txt");
FindFirstFile(lPath, &File_Data);
wcout << File_Data.cFileName;
}

Вы передаете путь, который хотите использовать в GetFiles (путь LPCSTR). Затем я использую функцию mergestring, чтобы объединить путь с расширением (\ *. Txt), все работает, кроме случаев, когда он возвращает LPCSTR, тогда его просто много странные персонажи и я не знаю почему или это лучший способ сделать это?

3

Решение

Ваш код необязательно сложно.
Если вы просто хотите добавить \*.txt суффикс строки входного пути, вы можете просто использовать std::string с его перегруженным operator+,

Затем, если вы хотите передать std::string к Win32 API, который имеет const char* (Т.е. LPCSTR), вы можете использовать std::string::c_str() метод:

void GetFiles(LPCSTR path)
{
WIN32_FIND_DATA fileData;
std::string searchPath(path);
searchPath += "\\*.txt";

FindFirstFile(searchPath.c_str(), &fileData);
wcout << fileData.cFileName;
}

Также обратите внимание, что в современном мире вы должны использовать Unicode (UTF-16) для программирования Win32; так const wchar_t* а также std::wstring лучшие варианты, чем const char* а также std::string,
Более того, я бы просто использовал std::wstring класс как параметр, а не необработанный wchar_t указатель.

void GetFiles(const std::wstring& path)
{
std::wstring searchPath = path + L"\\*.txt";
WIN32_FIND_DATA fileData;
FindFirstFile(searchPath.c_str(), &fileData);
std::wcout << fileData.cFileName;
}
5

Другие решения

Ваш GetFiles функция возвращает указатель на память, которая больше не действительна, File_Data.cFileName может использоваться только в GetFiles потому что там File_Data определено. Самое простое решение — использовать строковый класс C ++.std::string,

std::string GetFiles(LPCSTR path)
{
WIN32_FIND_DATA File_Data;
LPCSTR lPath = mergeString(path,"\\*.txt");
FindFirstFile(lPath, &File_Data);
return File_Data.cFileName;
}

Использование указателей излишне — плохая привычка, по такой причине (как и многие другие).

Ваша функция mergeString также должна быть переписана с меньшим количеством указателей.

std::string mergeString(LPCSTR firstString, std::string secondString)
{
string convertedString = ConvertString(firstString);
int i = convertedString.size();

convertedString.insert(i, secondString);
return convertedString;
}
0

По вопросам рекламы [email protected]