Здравствуйте, у меня есть проблема с моим кодом здесь.
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, тогда его просто много странные персонажи и я не знаю почему или это лучший способ сделать это?
Ваш код необязательно сложно.
Если вы просто хотите добавить \*.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;
}
Ваш 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;
}